欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java并發(fā)之ReentrantLock類源碼解析

 更新時間:2021年06月29日 08:55:30   作者:LaplaceDemon  
這篇文章主要為大家詳細介紹了Java并發(fā)系列之ReentrantLock源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

ReentrantLock內(nèi)部由Sync類實例實現(xiàn)。

Sync類定義于ReentrantLock內(nèi)部。

Sync繼承于AbstractQueuedSynchronizer。

AbstractQueuedSynchronizer繼承于AbstractOwnableSynchronizer。

AbstractOwnableSynchronizer類中只定義了一個exclusiveOwnerThread變量,表示當前擁有的線程。

除了Sync類,ReentrantLock內(nèi)部還定義了兩個實現(xiàn)類。

NonfairSync是非公平鎖。FairSync 是公平鎖。

ReentrantLock兩個構(gòu)造方法如下:

ReentrantLock的lock方法

非公平鎖的lock方法

compareAndSetState方法是一個CAS方法。該方法嘗試去更新對象內(nèi)的一個變量。變量期望是0,更新為1。

若更新成功,則將exclusiveOwnerThread變量設(shè)置為當前線程。然后lock方法會立刻返回。

若更新不成功,則調(diào)用acquire(1)。

acquire方法中首先調(diào)用tryAcquire()再次嘗試更新。

非公平鎖的tryAcquire()方法如下:

非公平鎖的tryAcquire()方法內(nèi)部調(diào)用nonfairTryAcquire方法如下:

若tryAcquire()方法再次嘗試不成功。則首先會調(diào)用addWaiter()方法,將當前線程加入等待隊列。addWaiter方法返回一個Node節(jié)點。

返回節(jié)點后,acquireQueued(node,1)會再次嘗試去做更新。

若還是無法更新,則通過parkAndCheckInterrupt將線程掛起。

ReentrantLock的unlock方法

查看release()方法。

若隊列的head不為空,且head的等待狀態(tài)不為0,則調(diào)用unparkSuccessor()方法。

unparkSuccessor()方法如下:

使node的next從后向前遍歷,獲取到隊列中最前面的一個waitStatus小于0的線程。然后將節(jié)點上的線程繼續(xù)執(zhí)行。

相關(guān)文章

  • Maven項目打包成war包部署到Tomcat的方法

    Maven項目打包成war包部署到Tomcat的方法

    這篇文章主要介紹了Maven項目打包成war包部署到Tomcat的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • SpringBoot 整合線程池的示例詳解

    SpringBoot 整合線程池的示例詳解

    線程池是一種利用池化技術(shù)思想來實現(xiàn)的線程管理技術(shù),主要是為了復(fù)用線程、便利地管理線程和任務(wù)、并將線程的創(chuàng)建和任務(wù)的執(zhí)行解耦開來,這篇文章主要介紹了SpringBoot 整合線程池的示例詳解,需要的朋友可以參考下
    2024-08-08
  • java項目中的多線程實踐記錄

    java項目中的多線程實踐記錄

    項目開發(fā)中對于一些數(shù)據(jù)的處理需要用到多線程,比如文件的批量上傳,數(shù)據(jù)庫的分批寫入,大文件的分段下載等,主要涉及到多線程的一些知識,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下
    2021-11-11
  • 玩轉(zhuǎn)spring boot 結(jié)合AngularJs和JDBC(4)

    玩轉(zhuǎn)spring boot 結(jié)合AngularJs和JDBC(4)

    玩轉(zhuǎn)spring boot,這篇文章主要介紹了結(jié)合AngularJs和JDBC,玩轉(zhuǎn)spring boot,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • struts2中類型轉(zhuǎn)換實例代碼

    struts2中類型轉(zhuǎn)換實例代碼

    這篇文章主要介紹了struts2中類型轉(zhuǎn)換實例代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Java中的ReadWriteLock高效處理并發(fā)讀寫操作實例探究

    Java中的ReadWriteLock高效處理并發(fā)讀寫操作實例探究

    這篇文章主要為大家介紹了Java中的ReadWriteLock高效處理并發(fā)讀寫操作實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Java多線Condition條件變量正確使用方法詳解

    Java多線Condition條件變量正確使用方法詳解

    這篇文章主要為大家,介紹了Java多線Condition條件變量正確使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java框架Quartz中API、Jobs和Trigger詳解

    Java框架Quartz中API、Jobs和Trigger詳解

    這篇文章主要介紹了Java框架Quartz中API、Jobs和Trigger詳解,JobDetail?對象是在將?job?加入?scheduler?時,由客戶端程序(你的程序)創(chuàng)建的,它包含?job?的各種屬性設(shè)置,以及用于存儲?job?實例狀態(tài)信息的?JobDataMap,需要的朋友可以參考下
    2023-11-11
  • jedis連接池對commons-pool的封裝示例詳解

    jedis連接池對commons-pool的封裝示例詳解

    這篇文章主要為大家介紹了jedis連接池對commons-pool的封裝示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • java讀取其他服務(wù)接口返回的json數(shù)據(jù)示例代碼

    java讀取其他服務(wù)接口返回的json數(shù)據(jù)示例代碼

    這篇文章主要給大家介紹了關(guān)于java讀取其他服務(wù)接口返回的json數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03

最新評論