ReentrantLock 源碼分析


1. 什麼是reentrantlock?

Reentrantlock 顧名思義重入鎖,表示這個鎖是可以重複進入的,你可能要問了,什麼情況下才可以重複進入呢? Good question, 重入的意思是:當一個線程持有某個鎖的時候,在它沒有釋放鎖之前去幹的其他的事情,那麼當他幹完其他的事情之後,它不需要再和其他線程競爭該鎖,可以直接獲得,這就是重入的意思。

2. 為什麼要使用Reentrantlock?

使用synchronized 不是更簡單嗎?為什麼還要使用Reentrantlock呢? 是的在大多數情況下這兩個鎖都可以滿足我們。

這就需要分析以下synchronized和Reentrantlock的區別了,先簡單的說一下,(因為這個問題如何需要展開說的話需要重開一個topic)。因為Reentrantlock支持公平鎖和非公平鎖,支持指定獲取鎖等待的時間避免死鎖。

3. Reentrantlock底層是如何實現的?

解讀Reentrantlock的源碼避免不了講解AQS(AbstractQueuedSynchronizer) 一個CLH鎖的java實現。AbstractQueuedSynchronizer中有幾個重要的屬性state,Node(雙向鏈表);其中state被volatile修飾,表示任意一個線程使用的state的值都是最新的(volatile的可見性),其默認值0,表示沒有被線程持有可以獲取鎖。


ReentrantLock 源碼分析


ReentrantLock 源碼分析

Reentrantlock內部維護了一個Sync類,這個同步類繼承AbstractQueuedSynchronizer

ReentrantLock 源碼分析

Reentrantlock獲取鎖的大部分邏輯都是AbstractQueuedSynchronizer類中,該類中有一個抽象的方法:tryAcquire,


ReentrantLock 源碼分析

這裡使用了模板模式(設計模式),

上面我們講到Reentrantlock支持公平鎖和非公平鎖從下面代碼可以看到是繼承了Sync類


ReentrantLock 源碼分析

FairSync 和NonfairSync裡面實現了AbstractQueuedSynchronizer. tryAcquire方法。

下面進入Reentrantlock獲取鎖的具體實現:

ReentrantLock 源碼分析

ReentrantLock 源碼分析


ReentrantLock 源碼分析


ReentrantLock 源碼分析

ReentrantLock 源碼分析

當此處整個獲取鎖的流程就結束了。上面介紹的非公平鎖,那麼公平鎖是如何實現的呢?

公平鎖的實現:


ReentrantLock 源碼分析


ReentrantLock 源碼分析


總結:一個圖簡單總結


ReentrantLock 源碼分析


以上僅為個人見解,如果有錯誤歡迎指出。


分享到:


相關文章: