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)文章
SpringMVC @GetMapping注解路徑?jīng)_突問題解決
MD5對密碼進行加密存儲是常見的一種加密方式,本文主要介紹了Java雙重MD5加密實現(xiàn)安全登錄,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

