ReentrantLock內部由Sync類實例實現。
Sync類定義於ReentrantLock內部。
Sync繼承於AbstractQueuedSynchronizer。
AbstractQueuedSynchronizer繼承於AbstractOwnableSynchronizer。
AbstractOwnableSynchronizer類中只定義了一個exclusiveOwnerThread變量,表示當前擁有的線程。
除了Sync類,ReentrantLock內部還定義了兩個實現類。
NonfairSync是非公平鎖。 FairSync 是公平鎖。
ReentrantLock兩個構造方法如下:
ReentrantLock的lock方法
非公平鎖的lock方法
compareAndSetState方法是一個CAS方法。該方法嘗試去更新對象內的一個變量。變量期望是0,更新為1。
若更新成功,則將exclusiveOwnerThread變量設置為當前線程。然後lock方法會立刻返回。
若更新不成功,則調用acquire(1)。
acquire方法中首先調用tryAcquire()再次嘗試更新。
非公平鎖的tryAcquire()方法如下:
非公平鎖的tryAcquire()方法內部調用nonfairTryAcquire方法如下:
若tryAcquire()方法再次嘗試不成功。則首先會調用addWaiter()方法,將當前線程加入等待隊列。 addWaiter方法返回一個Node節點。
返回節點後,acquireQueued(node,1)會再次嘗試去做更新。
若還是無法更新,則通過parkAndCheckInterrupt將線程掛起。
ReentrantLock的unlock方法
查看release()方法。
若隊列的head不為空,且head的等待狀態不為0,則調用unparkSuccessor()方法。
unparkSuccessor()方法如下:
使node的next從後向前遍歷,獲取到隊列中最前面的一個waitStatus小於0的線程。然後將節點上的線程繼續執行。