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

java并發(fā)編程StampedLock高性能讀寫鎖詳解

 更新時間:2022年05月16日 08:43:25   作者:字母哥  
這篇文章主要為大家介紹了java并發(fā)編程StampedLock高性能讀寫鎖的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、讀寫鎖

在我的《java并發(fā)編程》上一篇文章中為大家介紹了《ReentrantLock讀寫鎖》,ReentrantReadWriteLock可以保證最多同時有一個線程在寫數(shù)據(jù),或者可以同時有多個線程讀數(shù)據(jù),但讀寫不能同時進行。

比如你正在做的是日志,有一個線程正在做寫操作,但是在寫日志的時候你可能需要把日志集中轉移到集中管理日志服務,但是此時讀線程不能讀數(shù)據(jù)(因為無法獲取讀鎖)。面對這個需求,ReentrantReadWriteLock顯然不是我們的解決方案,我們希望:最多一個線程在進行寫操作(加寫鎖),但是同時允許多個線程進行讀操作(加讀鎖),解決方案是StampedLock。

二、悲觀讀鎖

StampedLock 同樣可以實現(xiàn)寫鎖和讀鎖的功能,Stamped在英文中有印章的含義,對于StampedLock大家可以這么理解,使用一個印章加鎖,必須使用該印章解鎖。

public class TestStampedLock {
    Map<String,String> map = new HashMap<>();
    //鎖對象
    private StampedLock lock = new StampedLock();
    //寫操作函數(shù)
    public void put(String key, String value){
        long stamp = lock.writeLock(); //加寫鎖
        try {
            map.put(key, value); //寫操作
        } finally {
            lock.unlockWrite(stamp);  //釋放寫鎖
        }
    }
    public String get(String key) {
        long stamp = lock.readLock(); //加讀鎖
        try {
            return map.get(key); //讀操作
        } finally {
            lock.unlockRead(stamp); //釋放讀鎖
        }
    }
}

上文中的讀鎖readLock,在StampedLock模式中被稱為悲觀讀鎖,之所以叫做悲觀讀鎖是和StampedLock支持的另一種模式“樂觀讀”相對應的。

寫鎖、悲觀讀鎖的語義和 ReadWriteLock 的寫鎖、讀鎖的語義基本是一致的,允許多個線程同時獲取悲觀讀鎖,但是只允許一個線程獲取寫鎖,寫鎖和悲觀讀鎖是互斥的。

多線程環(huán)境下,寫操作的同時不能讀。所以到這里為止,StampedLock與ReadWriteLock并沒有很大的區(qū)別。

三、樂觀讀

需要注意的是,這里我寫的是樂觀讀,而不是樂觀讀鎖,因為樂觀讀是不加鎖的。通過tryOptimisticRead()函數(shù)獲取一個stamp,這里的tryOptimisticRead() 就是樂觀讀,樂觀讀因為沒有加鎖,所以讀取數(shù)據(jù)的性能會更高一點。即:已經(jīng)有寫操作線程加鎖的同時,仍然允許讀操作線程繼續(xù)進行。

如果你的讀寫操作有比較強的時間點數(shù)據(jù)一致性要求,即:同一個時間點讀操作讀到的數(shù)據(jù),一定與該時間點寫操作保持數(shù)據(jù)一致性。那么,你就需要進行validate校驗,stamp此時可以理解為一個版本號,如果寫操作版本為2,讀操作版本為1,說明你讀到的數(shù)據(jù)不是最新的。你需要去讀取最新版本的數(shù)據(jù)(版本號為2),所以需要升級為悲觀讀鎖,代碼如下:

public String readWithOptimisticLock(String key) {
    long stamp = lock.tryOptimisticRead(); //樂觀讀
    String value = map.get(key); //讀取數(shù)據(jù)
    if(!lock.validate(stamp)) {  //校驗數(shù)據(jù)是否是最新版本
        stamp = lock.readLock();  //如果不是,升級為悲觀讀鎖
        try {
            return map.get(key);
        } finally {
            lock.unlock(stamp);               
        }
    }
    return value;
}

以上就是java并發(fā)編程StampedLock高性能讀寫鎖詳解的詳細內(nèi)容,更多關于java并發(fā)StampedLock讀寫鎖的資料請關注腳本之家其它相關文章!

相關文章

  • 簡述Springboot @Async 異步方法

    簡述Springboot @Async 異步方法

    這篇文章主要介紹了Springboot @Async 異步方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-05-05
  • Java順序表實現(xiàn)圖書管理系統(tǒng)

    Java順序表實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java順序表實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 關于Springboot | @RequestBody 接收到的參數(shù)對象屬性為空的問題

    關于Springboot | @RequestBody 接收到的參數(shù)對象屬性為空的問題

    這篇文章主要介紹了關于Springboot | @RequestBody 接收到的參數(shù)對象屬性為空的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 使用Lucene實現(xiàn)一個簡單的布爾搜索功能

    使用Lucene實現(xiàn)一個簡單的布爾搜索功能

    Lucene是一個全文搜索框架,而不是應用產(chǎn)品。因此它并不像www.baidu.com 或者google Desktop那么拿來就能用,它只是提供了一種工具讓你能實現(xiàn)這些產(chǎn)品。接下來通過本文給大家介紹使用Lucene實現(xiàn)一個簡單的布爾搜索功能
    2017-04-04
  • Java實現(xiàn)后臺發(fā)送及接收json數(shù)據(jù)的方法示例

    Java實現(xiàn)后臺發(fā)送及接收json數(shù)據(jù)的方法示例

    這篇文章主要介紹了Java實現(xiàn)后臺發(fā)送及接收json數(shù)據(jù)的方法,結合實例形式分析了java針對json格式數(shù)據(jù)的傳輸與操作相關技巧,需要的朋友可以參考下
    2018-12-12
  • SpringBoot整合SpringDataJPA的示例

    SpringBoot整合SpringDataJPA的示例

    本文主要介紹了SpringBoot整合SpringDataJPA的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 詳解如何在springcloud分布式系統(tǒng)中實現(xiàn)分布式鎖

    詳解如何在springcloud分布式系統(tǒng)中實現(xiàn)分布式鎖

    最近在看分布式鎖的資料,本文就介紹一下利用springcloud結合redis實現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 幾道常問Redis面試題,你能答對嗎?

    幾道常問Redis面試題,你能答對嗎?

    在程序員面試過程中redis相關的知識是常被問到的話題。這篇文章主要介紹了13道Redis面試題,整理一下分享給大家,感興趣的小伙伴們可以參考一下
    2021-07-07
  • SpringBoot自定義配置項過程

    SpringBoot自定義配置項過程

    在SpringBoot項目中,通過在application.properties文件中添加配置項,然后使用@ConfigurationProperties注解將這些配置項與實體Bean進行綁定,可以實現(xiàn)配置項與實體類字段的自動關聯(lián),進而方便地讀取配置文件中的數(shù)據(jù),這種方法不僅簡化了配置管理
    2024-11-11
  • Java判斷變量是否為空問題的方法總結

    Java判斷變量是否為空問題的方法總結

    項目中經(jīng)常遇到對象判空,下面這篇文章主要給大家介紹了關于Java判斷變量是否為空問題的方法,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-04-04

最新評論

渝中区| 忻州市| 张家川| 遵化市| 弥勒县| 大关县| 拜泉县| 元朗区| 桃园县| 木里| 包头市| 渭源县| 政和县| 祁阳县| 资源县| 洛阳市| SHOW| 平阳县| 稻城县| 江口县| 巴彦淖尔市| 上思县| 揭阳市| 新平| 沽源县| 托克托县| 新田县| 万山特区| 会东县| 灯塔市| 巴中市| 开平市| 海城市| 巩义市| 兴和县| 铜山县| 毕节市| 那曲县| 达拉特旗| 芦溪县| 普兰店市|