最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

舉例說明Java多線程編程中讀寫鎖的使用

 更新時間:2016年02月04日 14:58:47   作者:YangYiBao  
這篇文章主要介紹了舉例說明Java多線程編程中讀寫鎖的使用,文中的例子很好地說明了Java的自帶讀寫鎖ReentrantReadWriteLock的使用,需要的朋友可以參考下

以下示例為 java api并發(fā)庫中 ReentrantReadWriteLock自帶的實例,下面進行解讀

 class CachedData {
  Object data;
  volatile boolean cacheValid;
  ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

  void processCachedData() {
   rwl.readLock().lock();//@1
   if (!cacheValid) {
    // Must release read lock before acquiring write lock
    rwl.readLock().unlock();//@4
    rwl.writeLock().lock();//@2
    // Recheck state because another thread might have acquired
    //  write lock and changed state before we did.
    if (!cacheValid) {//@3
     data = ...
     cacheValid = true;
    }
    // Downgrade by acquiring read lock before releasing write lock
    rwl.readLock().lock();
    rwl.writeLock().unlock(); // Unlock write, still hold read
   }

   use(data);
   rwl.readLock().unlock();
  }
 }

當有n多線程 使用同一CachedData 實例對象 調(diào)用processCachedData方法時,就會產(chǎn)生線程的并發(fā)問題.
@1行,當有線程正在對數(shù)據(jù)進行 寫操作的時候,運行到@1行的線程要等待 寫操作的完成,因為第一個運行到@2的線程會加上鎖,然后對數(shù)據(jù)進行需該,期間不允許任何線程進行讀或者是寫的操作,

當寫完后,在該線程上加上讀鎖操作,以防止解寫鎖后,別的線程對數(shù)據(jù)再次進行寫時出錯.在第一個運行到@2的線程之后的很多線程,

可能已經(jīng)運行到了@4,當對數(shù)據(jù)修改好之后,解除掉寫鎖,別的線程就會執(zhí)行到@2,這時第一個線程已經(jīng)經(jīng)數(shù)據(jù)修改好了,所以有了@3的判斷。

在編寫多線程程序的時候,要置于并發(fā)線程的環(huán)境下考慮,巧妙的運用ReentrantReadWriteLock,在運用時,注意鎖的降級,寫入鎖可以獲得讀鎖,讀鎖不可以獲得寫入鎖,所以在上寫入鎖時,必須先將讀鎖進行解除,然后上讀鎖。

使用時注意的幾個方面:
    讀鎖是排寫鎖操作的,讀鎖不排讀鎖操作,多個讀鎖可以并發(fā)不阻塞。即在讀鎖獲取后和讀鎖釋放之前,寫鎖并不能被任何線程獲得,
      多個讀鎖同時作用期間,試圖獲取寫鎖的線程都處于等待狀態(tài),當最后一個讀鎖釋放后,試圖獲取寫鎖的線程才有機會獲取寫鎖。
    寫鎖是排寫鎖、排讀鎖操作的。當一個線程獲取到寫鎖之后,其他試圖獲取寫鎖和試圖獲取讀鎖的線程都處于等待狀態(tài),直到寫鎖被釋放。
      寫鎖是可以獲得讀鎖的,即:

      rwl.writeLock().lock();
      //在寫鎖狀態(tài)中,可以獲取讀鎖
      rwl.readLock().lock();
      rwl.writeLock().unlock();

  讀鎖是不能夠獲得寫鎖的,如果要加寫鎖,本線程必須釋放所持有的讀鎖,即:

      rwl.readLock().lock();
      //......
      //必須釋放掉讀鎖,才能夠加寫鎖
      rwl.readLock().unlock();
      rwl.writeLock().lock();

讀寫鎖是線程讀寫同一文件所需要用到的,讀寫鎖是什么東西在這里不做過多的解釋,可以自己去百度或谷歌去搜一下。

謹在此附上我自己寫的緩存系統(tǒng)的簡單實現(xiàn),你從中也能悟出緩存實現(xiàn)的基本思想

緩存里面有數(shù)據(jù)就從緩存中取,沒有就給你從其他地方得到。

package cn.com.scl.cache 
 
import java.util.HashMap; 
import java.util.Map; 
import java.util.concurrent.locks.ReadWriteLock; 
import java.util.concurrent.locks.ReentrantReadWriteLock; 
/** 
 * 緩存的實現(xiàn),每個線程只能獲得他自己的緩存,也應該是單例的 
 * 本類沒有去實現(xiàn)單例,如果需要的話可以自行去實現(xiàn) 
 * @author scl 
 * 
 */ 
public class CacheSystem { 
  private Map<String, Object> cache = new HashMap<String,Object>(); 
  private ReadWriteLock rwl = new ReentrantReadWriteLock(); 
  public Object getData(String key){ 
    //先從緩存中去取數(shù)據(jù),先加上讀鎖  
    rwl.readLock().lock(); 
    Object obj = null; 
    try{ 
      obj = cache.get(key); 
      if(obj == null){ 
        //先解除讀鎖,在上寫鎖(必須先解除讀鎖才能成功上寫鎖)  
        rwl.readLock().unlock(); 
        rwl.writeLock().lock(); 
        //去數(shù)據(jù)庫取數(shù)據(jù),再判斷一次是否為null,因為有可能多個線程獲得寫鎖  
        try{ 
        if(obj == null){ 
          obj = new String("obj is get from db"); 
        } 
        }finally{ 
          //先上讀鎖,然后再解除寫鎖(這樣可以成功完成,在解除寫鎖前獲得讀鎖,寫鎖被降級--這翻譯的api上的)  
          rwl.readLock().lock(); 
          rwl.writeLock().unlock();//解除寫鎖,讀鎖仍然持有  
        } 
      } 
    }finally{ 
      rwl.readLock().unlock(); 
    } 
    return obj; 
  } 
 
} 


相關(guān)文章

  • C#編寫Windows服務(wù)程序詳細步驟詳解(圖文)

    C#編寫Windows服務(wù)程序詳細步驟詳解(圖文)

    本文介紹了如何用C#創(chuàng)建、安裝、啟動、監(jiān)控、卸載簡單的Windows Service 的內(nèi)容步驟和注意事項,需要的朋友可以參考下
    2017-09-09
  • C#實現(xiàn)從PDF中提取表格的方法詳解

    C#實現(xiàn)從PDF中提取表格的方法詳解

    PDF是辦公中比較常見的一種文件格式,在工作中應用也越來越普遍。今天為大家介紹一種通過C#/VB.NET代碼從PDF中提取表格內(nèi)容的方法,感興趣的可以動手嘗試一下
    2022-08-08
  • C#屬性(Attribute)用法實例解析

    C#屬性(Attribute)用法實例解析

    這篇文章主要介紹了C#屬性(Attribute)用法實例解析,需要的朋友可以參考下
    2014-08-08
  • C#實現(xiàn)將TextBox綁定為KindEditor富文本

    C#實現(xiàn)將TextBox綁定為KindEditor富文本

    KindEditor?依靠出色的用戶體驗和領(lǐng)先的技術(shù)提供富文本編輯功能,是一款非常受歡迎的HTML在線編輯器,下面我們就來看看C#如何將TextBox綁定為KindEditor富文本吧
    2024-04-04
  • C# newtonsoft.json中文亂碼問號的解決方案

    C# newtonsoft.json中文亂碼問號的解決方案

    這篇文章主要介紹了C# newtonsoft.json中文亂碼問號的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C#串口通信工具類的封裝

    C#串口通信工具類的封裝

    這篇文章主要為大家詳細介紹了C#串口通信工具類封裝,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C# 視頻播放類

    C# 視頻播放類

    c#下實現(xiàn)視頻播放的類代碼。
    2009-06-06
  • c# 類型構(gòu)造器

    c# 類型構(gòu)造器

    CLR還支持類型構(gòu)造器,也稱為靜態(tài)構(gòu)造器。c#類型構(gòu)造器可應用引用類型和值類型,永遠沒有參數(shù)
    2012-10-10
  • C# 可空類型的實現(xiàn)示例

    C# 可空類型的實現(xiàn)示例

    本文主要介紹了C#中的可空類型,包含單問號(?)和雙問號(??),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • C#折線圖控件使用方法詳解

    C#折線圖控件使用方法詳解

    這篇文章主要為大家詳細介紹了C#折線圖控件的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

双城市| 馆陶县| 丰县| 郑州市| 石渠县| 仲巴县| 曲周县| 高邑县| 千阳县| 延安市| 额敏县| 天水市| 临夏市| 祥云县| 临湘市| 松原市| 吉木乃县| 宜兰市| 宜昌市| 临西县| 浪卡子县| 武安市| 土默特左旗| 丰县| 枣阳市| 高州市| 广安市| 小金县| 贵港市| 安宁市| 正宁县| 西和县| 扎囊县| 甘德县| 中卫市| 雅江县| 启东市| 湟中县| 津市市| 莫力| 台江县|