Java并發(fā)之ReentrantLock類源碼解析
ReentrantLock內(nèi)部由Sync類實(shí)例實(shí)現(xiàn)。
Sync類定義于ReentrantLock內(nèi)部。
Sync繼承于AbstractQueuedSynchronizer。
AbstractQueuedSynchronizer繼承于AbstractOwnableSynchronizer。
AbstractOwnableSynchronizer類中只定義了一個(gè)exclusiveOwnerThread變量,表示當(dāng)前擁有的線程。
除了Sync類,ReentrantLock內(nèi)部還定義了兩個(gè)實(shí)現(xiàn)類。
NonfairSync是非公平鎖。FairSync 是公平鎖。
ReentrantLock兩個(gè)構(gòu)造方法如下:
ReentrantLock的lock方法
非公平鎖的lock方法
compareAndSetState方法是一個(gè)CAS方法。該方法嘗試去更新對(duì)象內(nèi)的一個(gè)變量。變量期望是0,更新為1。
若更新成功,則將exclusiveOwnerThread變量設(shè)置為當(dāng)前線程。然后lock方法會(huì)立刻返回。
若更新不成功,則調(diào)用acquire(1)。
acquire方法中首先調(diào)用tryAcquire()再次嘗試更新。
非公平鎖的tryAcquire()方法如下:
非公平鎖的tryAcquire()方法內(nèi)部調(diào)用nonfairTryAcquire方法如下:
若tryAcquire()方法再次嘗試不成功。則首先會(huì)調(diào)用addWaiter()方法,將當(dāng)前線程加入等待隊(duì)列。addWaiter方法返回一個(gè)Node節(jié)點(diǎn)。
返回節(jié)點(diǎn)后,acquireQueued(node,1)會(huì)再次嘗試去做更新。
若還是無(wú)法更新,則通過(guò)parkAndCheckInterrupt將線程掛起。
ReentrantLock的unlock方法
查看release()方法。
若隊(duì)列的head不為空,且head的等待狀態(tài)不為0,則調(diào)用unparkSuccessor()方法。
unparkSuccessor()方法如下:
使node的next從后向前遍歷,獲取到隊(duì)列中最前面的一個(gè)waitStatus小于0的線程。然后將節(jié)點(diǎn)上的線程繼續(xù)執(zhí)行。
相關(guān)文章
Maven項(xiàng)目打包成war包部署到Tomcat的方法
這篇文章主要介紹了Maven項(xiàng)目打包成war包部署到Tomcat的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06玩轉(zhuǎn)spring boot 結(jié)合AngularJs和JDBC(4)
玩轉(zhuǎn)spring boot,這篇文章主要介紹了結(jié)合AngularJs和JDBC,玩轉(zhuǎn)spring boot,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究
這篇文章主要為大家介紹了Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Java框架Quartz中API、Jobs和Trigger詳解
這篇文章主要介紹了Java框架Quartz中API、Jobs和Trigger詳解,JobDetail?對(duì)象是在將?job?加入?scheduler?時(shí),由客戶端程序(你的程序)創(chuàng)建的,它包含?job?的各種屬性設(shè)置,以及用于存儲(chǔ)?job?實(shí)例狀態(tài)信息的?JobDataMap,需要的朋友可以參考下2023-11-11jedis連接池對(duì)commons-pool的封裝示例詳解
這篇文章主要為大家介紹了jedis連接池對(duì)commons-pool的封裝示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09java讀取其他服務(wù)接口返回的json數(shù)據(jù)示例代碼
這篇文章主要給大家介紹了關(guān)于java讀取其他服務(wù)接口返回的json數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03