天天看點

28 AbstractQueuedSynchronizer(AQS)詳解

  1. 在了解AQS之前,首先需要了解公平鎖和非公平鎖
  2. ReentranLock分為公平鎖和非公平鎖。二者的差別就在擷取鎖機會是否和排隊順序相關
  3. 公平鎖: 公平是針對鎖的擷取而言的,如果一個鎖是公平的,那麼鎖的擷取順序就應該符合請求的絕對時間順序

    就是說:如果鎖被另一個線程持有,那麼其他申請鎖的線程會被挂起等待,加入等待隊列。如果是公平的,那麼就應該誰先申請鎖,誰排在等待隊列的最前面。後申請的就應該排在後面。

  4. 當鎖被釋放的時候,通知等待線程再次嘗試擷取鎖,公平鎖會讓最先進入隊列的線程獲得鎖。而非公平鎖則會喚醒所有線程,讓它們再次競争嘗試擷取鎖,是以可能會導緻後來的線程先獲得了鎖,這就是非公平鎖。
  5. 通過觀察源碼可以知道,ReentrantLock實作的加鎖,釋放鎖的底層實作原理就是AQS.
  6. 基本上所有的方法的實作實際上都是調用了其靜态記憶體類Sync中的方法,而Sync類繼承了AbstractQueuedSynchronizer(AQS)
  7. 是以想要了解ReentrantLock這個類,關鍵核心在于對隊列同步器AbstractQueuedSynchronizer的了解。

    注意思考一下,此處為什麼稱其為隊列同步器?作者的解釋如下:

    Provides a framework for implementing blocking locks and related

    synchronizers (semaphores, events, etc) that rely on(依靠,依賴)

    first-in-first-out (FIFO)(先進先出) wait queues…

    隊列同步器提供用來建構鎖和其他同步元件的架構,它的實作主要依賴一個int成員變量來表示同步狀态以及通過一個FIFO隊列構成等待隊列。它的子類必須重寫AQS的幾個protected修飾的用來改變同步狀态的方法,其他方法主要是實作了排隊和阻塞機制。

此處的state就是volatile修飾的。是以此處首先確定了state的可見性

28 AbstractQueuedSynchronizer(AQS)詳解

8. 隊列同步器(AQS)沒有實作任何同步接口,AQS也是繼承了一個抽象類而已,**

9. AQS定義了若幹同步狀态的擷取和釋放方法**這樣做的目的是用來供自定義同步元件的使用,隊列同步器(AQS)既支援獨占式擷取同步狀态,也可以支援共享式擷取同步狀态,這樣就可以友善的實作不同類型的同步元件。

10.

繼續閱讀