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
最代碼最近下載分享源代碼列表最近下載
aisuzhen LV99月17日
月亮月亮星星
springbootzxx LV37月26日
星星星星星星
倪卟懂 LV165月7日
太陽
afeng992211 LV142018年10月12日
月亮月亮月亮星星星星
tyd888 LV92018年9月27日
月亮月亮星星
superman_0001 LV52018年7月18日
月亮星星
CLATZJ LV192018年3月25日
太陽星星星星星星
der2030 LV172018年1月23日
太陽星星
15735184511 LV72018年1月4日
月亮星星星星星星
dulante LV42017年10月25日
月亮
最代碼最近瀏覽分享源代碼列表最近瀏覽
jasonborn LV29月25日
星星星星
4703413539月23日
暫無貢獻等級
aisuzhen LV99月17日
月亮月亮星星
a30575795849月9日
暫無貢獻等級
tcdt160426 LV19月6日
星星
woaichiliancai LV29月3日
星星星星
周海龍8月31日
暫無貢獻等級
1391237686 LV48月28日
月亮
lby970321 LV18月27日
星星
whywhywhy LV108月19日
月亮月亮星星星星
頂部客服微信二維碼底部
>掃描二維碼關注最代碼為好友掃描二維碼關注最代碼為好友
谁有北京pk10计划群