亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、讀寫(xiě)鎖

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

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

二、悲觀讀鎖

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

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

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

寫(xiě)鎖、悲觀讀鎖的語(yǔ)義和 ReadWriteLock 的寫(xiě)鎖、讀鎖的語(yǔ)義基本是一致的,允許多個(gè)線程同時(shí)獲取悲觀讀鎖,但是只允許一個(gè)線程獲取寫(xiě)鎖,寫(xiě)鎖和悲觀讀鎖是互斥的。

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

三、樂(lè)觀讀

需要注意的是,這里我寫(xiě)的是樂(lè)觀讀,而不是樂(lè)觀讀鎖,因?yàn)闃?lè)觀讀是不加鎖的。通過(guò)tryOptimisticRead()函數(shù)獲取一個(gè)stamp,這里的tryOptimisticRead() 就是樂(lè)觀讀,樂(lè)觀讀因?yàn)闆](méi)有加鎖,所以讀取數(shù)據(jù)的性能會(huì)更高一點(diǎn)。即:已經(jīng)有寫(xiě)操作線程加鎖的同時(shí),仍然允許讀操作線程繼續(xù)進(jìn)行。

如果你的讀寫(xiě)操作有比較強(qiáng)的時(shí)間點(diǎn)數(shù)據(jù)一致性要求,即:同一個(gè)時(shí)間點(diǎn)讀操作讀到的數(shù)據(jù),一定與該時(shí)間點(diǎn)寫(xiě)操作保持?jǐn)?shù)據(jù)一致性。那么,你就需要進(jìn)行validate校驗(yàn),stamp此時(shí)可以理解為一個(gè)版本號(hào),如果寫(xiě)操作版本為2,讀操作版本為1,說(shuō)明你讀到的數(shù)據(jù)不是最新的。你需要去讀取最新版本的數(shù)據(jù)(版本號(hào)為2),所以需要升級(jí)為悲觀讀鎖,代碼如下:

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

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

相關(guān)文章

  • SpringBoot中使用websocket出現(xiàn)404的解決方法

    SpringBoot中使用websocket出現(xiàn)404的解決方法

    在Springboot中使用websocket時(shí),本地開(kāi)發(fā)環(huán)境可以正常運(yùn)行,但部署到服務(wù)器環(huán)境出現(xiàn)404問(wèn)題,所以本文小編講給大家詳細(xì)介紹一下SpringBoot中使用websocket出現(xiàn)404的解決方法,需要的朋友可以參考下
    2023-09-09
  • Java看完秒懂版熔斷和降級(jí)的關(guān)系

    Java看完秒懂版熔斷和降級(jí)的關(guān)系

    這篇文章主要介紹了Java熔斷和降級(jí)的關(guān)系,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 舉例講解JDK注解的使用和自定義注解的方法

    舉例講解JDK注解的使用和自定義注解的方法

    今天小編就為大家分享一篇關(guān)于舉例講解JDK注解的使用和自定義注解的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Java之Mybatis的二級(jí)緩存

    Java之Mybatis的二級(jí)緩存

    本文主要介紹Java中Mybatis的二級(jí)緩存,緩存就是一塊內(nèi)存空間,保存臨時(shí)數(shù)據(jù),它是SqlSessionFactory的緩存,對(duì)Mybaits感興趣的小伙伴可以參考閱讀
    2023-03-03
  • 詳解IDEA啟動(dòng)多個(gè)微服務(wù)的配置方法

    詳解IDEA啟動(dòng)多個(gè)微服務(wù)的配置方法

    這篇文章主要介紹了詳解IDEA啟動(dòng)多個(gè)微服務(wù)的配置方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java 文創(chuàng)商城系統(tǒng)的實(shí)現(xiàn)流程

    Java 文創(chuàng)商城系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+mysql+maven+tomcat實(shí)現(xiàn)一個(gè)文創(chuàng)商城系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • maven中pom.xml詳細(xì)介紹

    maven中pom.xml詳細(xì)介紹

    最近在學(xué)習(xí)maven,這篇文章主要介紹了maven中pom.xml詳細(xì)介紹,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java實(shí)現(xiàn)簡(jiǎn)易圖書(shū)借閱系統(tǒng)

    Java實(shí)現(xiàn)簡(jiǎn)易圖書(shū)借閱系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易圖書(shū)借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解

    Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解

    SpringBootAdmin是一個(gè)管理和監(jiān)控SpringBoot應(yīng)用程序的工具,可通過(guò)集成和配置實(shí)現(xiàn)應(yīng)用監(jiān)控與告警功能,本文給大家介紹Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • SpringBoot+Redis實(shí)現(xiàn)數(shù)據(jù)字典的方法

    SpringBoot+Redis實(shí)現(xiàn)數(shù)據(jù)字典的方法

    這篇文章主要介紹了SpringBoot+Redis實(shí)現(xiàn)數(shù)據(jù)字典的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論