1. 程式人生 > >ReentrantLock鎖 源碼分析

ReentrantLock鎖 源碼分析

-s strong abs 分享圖片 隊列 返回 true 判斷 直接

默認構造函數

技術分享圖片

內部類NonfairSync(非公平)

技術分享圖片

1.lock()方法

技術分享圖片

(AQS)AbstractQueuedSynchronizer.acquire()方法

技術分享圖片

tryAcquire 方法

技術分享圖片

nonfairTryAcquire 方法

技術分享圖片

addWaiter 方法

技術分享圖片

enq 方法

技術分享圖片

return t 為當前新增節點的上一個節點,目前沒有發現這個返回有什麽直接用處,addWaiter 方法就是把當前線程的節點放入AQS隊列的尾部

備註: 上述表述的同步隊列即為aqs隊列

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

2.unlock()方法

技術分享圖片

技術分享圖片

技術分享圖片

ReentrantLock公平鎖其實上述非公平鎖類似

非公平鎖在獲取鎖的時候,會先通過CAS進行搶占,而公平鎖則不會,

判斷條件多了hasQueuedPredecessors()方法,也就是加入了同步隊列中當前節點是否有前驅節點]的判斷,如果該方法返回true,則表示有線程比當前線程更早地請求獲取鎖,因此需要等待前驅線程獲取並釋放鎖之後才能繼續獲取鎖。

技術分享圖片

ReentrantLock鎖 源碼分析