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ì)再次嘗試去做更新。

若還是無法更新,則通過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)文章
SpringMVC @GetMapping注解路徑?jīng)_突問題解決
MD5對(duì)密碼進(jìn)行加密存儲(chǔ)是常見的一種加密方式,本文主要介紹了Java雙重MD5加密實(shí)現(xiàn)安全登錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
java入門概念個(gè)人理解之package與import淺析
下面小編就為大家?guī)硪黄猨ava入門概念個(gè)人理解之package與import淺析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
Java虛擬機(jī)裝載和初始化一個(gè)class類代碼解析
這篇文章的主要內(nèi)容是Java虛擬機(jī)裝載和初始化一個(gè)class類的代碼解析,包括介紹了裝載和初始化的時(shí)機(jī)與方式,需要的朋友可以參考下。2017-09-09

