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

ReentrantReadWriteLock不能鎖升級的原因總結

 更新時間:2021年06月30日 11:18:50   作者:skyline_wx  
今天給大家?guī)淼氖顷P于Java并發(fā)的相關知識,文章圍繞著為什么ReentrantReadWriteLock不能鎖升級展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下

為什么ReentrantReadWriteLock不能鎖升級

ReentrantReadWriteLock中,鎖是不可以升級的,只能降級。

也就是如果當前線程持有了ReadLock,那么就不能再獲取WriteLock,但是,如果當前線程持有了WriteLock,可以直接獲取ReadLock

下面用代碼嘗試一下:

Logger logger = LoggerFactory.getLogger(this.getClass());
ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
logger.info("線程:[{}],開始readLock",Thread.currentThread().getName());
readLock.lock();
logger.info("線程:[{}],readLock成功",Thread.currentThread().getName());
logger.info("線程:[{}],開始writeLock",Thread.currentThread().getName());
writeLock.lock();
logger.info("線程:[{}],writeLock成功",Thread.currentThread().getName());

從打印結果可以看出來,程序阻塞在了writeLock.lock();這一行上。

鎖升級失敗

下面我們看一下WriteLock的加鎖過程的部分源碼:

java.util.concurrent.locks.ReentrantReadWriteLock.Sync#tryAcquire

tryAcquire

當這個tryAcquire返回false時,就跟ReentrantLock的邏輯差不多了,最后各種判斷條件都會失敗,最后,程序會阻塞在這里:java.util.concurrent.locks.AbstractQueuedSynchronizer#parkAndCheckInterrupt

parkAndCheckInterrupt

用流程圖來描述一下這個問題是這樣的:

在這里插入圖片描述

假如只有一個線程t1,當t1已經(jīng)獲取讀鎖之后,再次獲取寫鎖,因為寫鎖在加鎖時判斷到當前鎖已經(jīng)被加過讀鎖讀寫互斥,所以寫鎖會等待讀鎖釋放之后再加鎖。但是因為讀鎖是被當前線程持有的,所以這個等待會無限的等待下去,最后就成了死鎖。

到此這篇關于ReentrantReadWriteLock不能鎖升級的原因總結的文章就介紹到這了,更多相關ReentrantReadWriteLock不能鎖升級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java 自定義線程池和線程總數(shù)控制操作

    Java 自定義線程池和線程總數(shù)控制操作

    這篇文章主要介紹了Java 自定義線程池和線程總數(shù)控制操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • RocketMQ事務消息原理與使用詳解

    RocketMQ事務消息原理與使用詳解

    RocketMQ事務消息(Transactional Message)是指應用本地事務和發(fā)送消息操作可以被定義到全局事務中,要么同時成功,要么同時失敗。RocketMQ的事務消息提供類似 X/Open XA 的分布式事務功能,通過事務消息能達到分布式事務的最終一致
    2023-02-02
  • Spring Cloud Alibaba Nacos Config加載配置詳解流程

    Spring Cloud Alibaba Nacos Config加載配置詳解流

    這篇文章主要介紹了Spring Cloud Alibaba Nacos Config配置中心實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-07-07
  • JDK14的新特性:instanceof模式匹配的使用

    JDK14的新特性:instanceof模式匹配的使用

    這篇文章主要介紹了JDK 14的新特性:instanceof模式匹配的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • SpringBoot集成EasyExcel的步驟

    SpringBoot集成EasyExcel的步驟

    EasyExcel是阿里巴巴開源poi插件之一,主要解決了poi框架使用復雜,sax解析模式不容易操作,數(shù)據(jù)量大起來容易OOM,解決了POI并發(fā)造成的報錯。主要解決方式:通過解壓文件的方式加載,一行一行的加載,并且拋棄樣式字體等不重要的數(shù)據(jù),降低內(nèi)存的占用。
    2021-06-06
  • java基于NIO實現(xiàn)群聊模式

    java基于NIO實現(xiàn)群聊模式

    這篇文章主要為大家詳細介紹了java實現(xiàn)NIO實現(xiàn)群聊模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • MyBatis-Plus介紹及Spring Boot 3集成指南

    MyBatis-Plus介紹及Spring Boot 3集成指南

    本文介紹了MyBatis-Plus的基本特性及其與Spring Boot 3的集成步驟,通過使用MyBatis-Plus,開發(fā)者可以快速地搭建和開發(fā)數(shù)據(jù)訪問層,同時提高代碼質(zhì)量和開發(fā)效率,感興趣的朋友一起看看吧
    2024-05-05
  • Java實現(xiàn)常用的三種加密算法詳解

    Java實現(xiàn)常用的三種加密算法詳解

    編程中常見的加密算法有以下幾種:信息摘要算法、對稱加密算法以及非對稱加密算法。本文將利用Java實現(xiàn)這幾種常見的加密算法,需要的可以參考一下
    2022-03-03
  • JAVA多線程線程安全性基礎

    JAVA多線程線程安全性基礎

    這篇文章主要介紹了如何測試Java類的線程安全性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-08-08
  • MyBatis-plus如何執(zhí)行自定義SQL

    MyBatis-plus如何執(zhí)行自定義SQL

    這篇文章主要介紹了MyBatis-plus如何執(zhí)行自定義SQL問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評論

通渭县| 洛川县| 兴隆县| 囊谦县| 湟中县| 太康县| 揭东县| 句容市| 郑州市| 湖口县| 临邑县| 安福县| 乌兰察布市| 肥西县| 许昌市| 龙游县| 乌审旗| 合阳县| 洛宁县| 南充市| 邹城市| 柳林县| 新郑市| 金坛市| 河东区| 婺源县| 堆龙德庆县| 承德市| 饶阳县| 子长县| 海门市| 荥经县| 江西省| 江阴市| 麻江县| 陕西省| 洛阳市| 博野县| 巴塘县| 鄂托克前旗| 兴文县|