站長資訊網
        最全最豐富的資訊網站

        什么是讀寫鎖

        什么是讀寫鎖

        我們知道多個線程同時讀一個資源類是沒有任何問題的,所以在并發的情況下,讀取共享資源應該是可以同時進行的;但是,如果一個線程想要去寫共享資源,就不應該再有其他線程同時對該共享資源進行讀或者是寫操作了。

        (推薦教程:java入門教程)

        我們想要的是:允許多個線程同時讀,但只要有一個線程在寫,其他線程就必須等待。

        什么是讀寫鎖

        讀寫鎖就是這個原理,即讀寫鎖在同一時刻可以允許多個多線程訪問,但是在寫線程訪問的時候,所有的讀線程和其他寫線程都會被阻塞。讀寫鎖實際維護了一對鎖,一個讀鎖,一個寫鎖,通過分離讀鎖和寫鎖,使得其并發性比獨占式鎖(排他鎖)有了很大的提升。

        代碼示例:

        public class ReadWriteLockDemo {     public static void main(String[] args) {         ReadWriteLock readWriteLock = new ReentrantReadWriteLock();         Book book = new Book();//創建一本書,可讀可寫          //兩個寫手         for (int i = 0; i < 2; i++) {             int num = i;             new Thread(()->{                 try {                     readWriteLock.writeLock().lock();                     System.out.println("寫手"+num+"在寫文章");                     book.write(String.valueOf(num),UUID.randomUUID().toString().substring(0,5));                 }catch (Exception e){                     e.printStackTrace();                 }finally {                     readWriteLock.writeLock().unlock();                 }             },String.valueOf(i)).start();         }          //6個讀者         for (int i = 0; i < 6; i++) {             int num = i;             new Thread(()->{                 try {                     readWriteLock.readLock().lock();                     String word = book.read(String.valueOf(num % 2));                     System.out.println("讀者"+num+"在閱讀文章..."+word);                 } catch (Exception e) {                     e.printStackTrace();                 } finally {                     readWriteLock.readLock().unlock();                 }             },String.valueOf(i)).start();         }     } } class Book{     HashMap<String, String> map = new HashMap<>();     public void write(String key,String val){         map.put(key, val);     }     public String read(String key){         String word = map.get(key);         return word;     } }

        輸出結果:

        "C:Program FilesJavajdk1.8.0_144binjava.exe" "-javaagent:F:MyDirIDEAIDEA2018IntelliJ IDEA 2018.2.4libidea_rt.jar=54141:F:MyDirIDEAIDEA2018IntelliJ IDEA 2018.2.4bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.8.0_144jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_144jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_144jrelibrt.jar;E:idea_workplacejavaBasetargetclasses" 寫手0在寫文章 寫手1在寫文章 讀者0在閱讀文章...6b021 讀者1在閱讀文章...220e4 讀者2在閱讀文章...6b021 讀者4在閱讀文章...6b021 讀者3在閱讀文章...220e4 讀者5在閱讀文章...220e4  Process finished with exit code 0

        讀寫鎖的效率

        (視頻教程推薦:java視頻教程)

        讀寫鎖是否會提高使用互斥鎖的性能取決于數據被讀取的頻率與被修改的頻率,讀取和寫入操作的持續時間以及數據的爭用 ,嘗試同時讀取或寫入數據的線程數。

        例如最初填充數據的集合,然后經常被修改的頻繁的搜索(例如某種目錄)是使用讀寫鎖的理想候選。 然而,如果更新變得頻繁,那么數據的大部分時間將被專門鎖定,并且并發性增加很少。

        此外,如果讀取操作太短,則讀寫鎖定實現(其本身比互斥鎖更復雜)的開銷可以支配執行成本,特別是因為許多讀寫鎖定實現仍將序列化所有線程通過小部分代碼。 最終,只有剖析和測量將確定使用讀寫鎖是否適合您的應用程序。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久99精品免费一区二区| 欧洲精品久久久av无码电影| 欧美在线精品一区二区三区| 国产精品v欧美精品v日韩精品| 亚洲精品456播放| 精品久久久久久久久久中文字幕| 四虎在线精品视频一二区| 国产精品亚韩精品无码a在线| 欧美日韩国产中文精品字幕自在自线| 久久国产成人精品麻豆| 精品国产sm捆绑最大网免费站 | 99精品国产一区二区三区| 亚洲精品制服丝袜四区| 日韩精品无码免费视频| 国产精品自在线拍国产手机版 | 国产三级国产精品国产普男人 | 精品国精品国产自在久国产应用男| 青青久久精品国产免费看| 亚洲国产精品无码久久久秋霞2 | 真实国产乱子伦精品视频| 国产亚洲福利精品一区| 久久er国产精品免费观看2| 最新国产精品拍自在线播放| 在线涩涩免费观看国产精品| 久久人搡人人玩人妻精品首页| 欧洲精品99毛片免费高清观看| 久热精品视频第一页| 国产精品伦一区二区三级视频| 国自产偷精品不卡在线| 国产精品99| 亚洲精品无码国产| 亚洲国产成人精品91久久久| 欧美激情视频精品一区二区| 日本精品久久久久影院日本| 国产精品视频二区不卡| 中文字幕亚洲精品无码| 88国产精品无码一区二区三区| 无码国模国产在线无码精品国产自在久国产| 91麻豆精品视频在线观看| 国产精品女人呻吟在线观看| 久久精品国产一区二区三区日韩|