最代碼廣告位
已注銷用戶的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
最代碼最近下載分享源代碼列表最近下載
aisuzhen LV102019年9月17日
月亮月亮星星星星
springbootzxx LV52019年7月26日
月亮星星
倪卟懂 LV172019年5月7日
太陽星星
afeng992211 LV142018年10月12日
月亮月亮月亮星星星星
tyd888 LV112018年9月27日
月亮月亮星星星星星星
superman_0001 LV52018年7月18日
月亮星星
CLATZJ LV192018年3月25日
太陽星星星星星星
der2030 LV172018年1月23日
太陽星星
15735184511 LV72018年1月4日
月亮星星星星星星
dulante LV42017年10月25日
月亮
最代碼最近瀏覽分享源代碼列表最近瀏覽
Call Me 采先森 LV105月25日
月亮月亮星星星星
zhangjune4月24日
暫無貢獻等級
KiwiFruit2020 LV44月21日
月亮
yinyun1985 LV114月8日
月亮月亮星星星星星星
lllpppwww LV53月25日
月亮星星
1798672867 LV133月21日
月亮月亮月亮星星
jojo1989453月6日
暫無貢獻等級
wei112233 LV152月2日
月亮月亮月亮星星星星星星
神龍擺尾無拘束 LV21月30日
星星星星
rocket666 LV11月13日
星星
頂部客服微信二維碼底部
>掃描二維碼關注最代碼為好友掃描二維碼關注最代碼為好友
海王捕鱼2内购破解版