coding
最代碼伊成的gravatar頭像
最代碼伊成2015-12-17 15:53:25

java多線程類ReentrantReadWriteLock讀寫鎖實例代碼及內存緩存工具類

主要分享兩個代碼

1.ReentrantReadWriteLock 讀寫demo

2.利用ReentrantReadWriteLock寫一個內存工具類

 

ReentrantReadWriteLock 讀寫demo

代碼片段如下:

        private Object data = null;//模擬數據
	private ReentrantReadWriteLock RWL = new ReentrantReadWriteLock();// 創建一個讀寫鎖對象
	
	//讀取數據方法
	public void get(){
		RWL.readLock().lock();//上讀鎖
		System.out.println(Thread.currentThread().getName()+" 這個時候只能讀數據咯....");
		try {
			Thread.sleep((long)new Random().nextInt(10000));
		} catch (Exception e) {
			// TODO: handle exception
		}
		System.out.println(Thread.currentThread().getName()+" 發現可讀數據--->:"+data);
		RWL.readLock().unlock();//釋放讀鎖
	}

運行結果圖,如下:

java多線程類ReentrantReadWriteLock讀寫鎖實例代碼及內存緩存工具類

寫在后面

ReentrantReadWriteLock會使用兩把鎖來解決問題,一個讀鎖,一個寫鎖
線程進入讀鎖的前提條件:
   沒有其他線程的寫鎖,
    沒有寫請求或者有寫請求,但調用線程和持有鎖的線程是同一個


線程進入寫鎖的前提條件:
   沒有其他線程的讀鎖
    沒有其他線程的寫鎖

 

讀寫鎖:分為讀鎖和寫鎖,多個讀鎖不互斥,讀鎖與寫鎖互斥,這是由jvm自己控制的。

如果你的代碼只讀數據,可以很多人同時讀,但不能同時寫,那就上讀鎖,

如果你的代碼修改數據,只能有一個人在寫,且不能同時讀取,那就上寫鎖。總之,讀的時候上讀鎖,寫的時候上寫鎖!

 

----------------------------------------------- 黃金分割線 -----------------------------------------------------

最后根據以上代碼,整合一個 內存緩存工具類

代碼不做解釋了,里面都有注釋,有需要的牛牛,快來下載吧!

代碼片段如下:

            // 緩存
	    private Map<K, V> cache = new HashMap<K, V>();
		
	    private final ReentrantReadWriteLock RL = new ReentrantReadWriteLock();
	    private final Lock R = RL.readLock();
	    private final Lock W = RL.writeLock();

	    /**
	     * 根據key獲取緩存信息
	     * 
	     * @param key
	     * 
	     * @return
	     */
	    public V get(K key){
	    	R.lock();
	    	try{
	    		return cache.get(key);
	    	} finally {
	    		R.unlock();
	    	}
	    }
	    
	    /**
	     * 設置緩存
	     * 
	     * @param key
	     * @param value
	     */
	    public void put(K key, V value){
	    	W.lock();
	    	
	    	try{
	    		cache.put(key, value);
	    	} finally {
	    		W.unlock();
	    	}
	    }

打賞

已有2人打賞

ddr的gravatar頭像最代碼官方的gravatar頭像

文件名:demo.zip,文件大小:8.582K下載
  • /
      • /demo
        • /demo/.classpath
        • /demo/.project
          • /demo/.settings
            • /demo/.settings/org.eclipse.jdt.core.prefs
          • /demo/bin
              • /demo/bin/com
                  • /demo/bin/com/zuidaima
                      • /demo/bin/com/zuidaima/thread
                        • /demo/bin/com/zuidaima/thread/Demo1.class
                        • /demo/bin/com/zuidaima/thread/MemoryCacheUtil.class
                        • /demo/bin/com/zuidaima/thread/ReadWriteLockDemo$1.class
                        • /demo/bin/com/zuidaima/thread/ReadWriteLockDemo$2.class
                        • /demo/bin/com/zuidaima/thread/ReadWriteLockDemo.class
頂部客服微信二維碼底部
>掃描二維碼關注最代碼為好友掃描二維碼關注最代碼為好友
天津时时开奖结果