AbstractQueuedSynchronizer源碼分析(一) 概述

工欲善其事,必先利其器。不管咱們學習什麼樣的框架或者源碼都必須問本身三個問題,它是什麼?它能用來作什麼?它是怎麼作的?本節咱們就帶着這三個問題來理解大概。安全

一 註釋翻譯

源碼中有着大量的註釋,可以幫助咱們理解做者的一些設計思路和設計目的,能夠幫助咱們更好的理解一些細節實現。框架

基於FIFO等待隊列提供了一個實現阻塞鎖和其餘同步工具的框架。該類爲基於一個原子性的int類型狀態的同步工具實現提供了通用抽象。實現AQS的子類必須定義父類的protected的方法去改變這個狀態,而且定義該狀態在獲取和釋放鎖時的具體含義。基於此,該類中的其餘方法執行全部排隊和阻塞機制。子類能夠維護其餘狀態屬性,可是隻有經過父類的getState(),setState(),compareAndSetState()方法操做的纔會有效.

子類應該被實現爲一個非public的內部類來幫助外部類實現同步機制,AQS自己不實現任何同步接口,相反它定義了一些方法來幫助具體的同步工具類實現它們的public方法

AQS支持獨佔模式或者共享模式也能夠都支持。在獨佔模式下,一個線程獲取了許可,其餘線程不可能在獲取許可。在共享模式下,能夠有多個線程獲取了許可,若是一個線程獲取了許可,下一個等待的線程必須決定是否也須要獲取許可。不管是採用什麼模式,它們都會在同一個FIFO等待隊列上等待,一般來講子類都只是實現其中的一種模式,但也有例外就是讀寫鎖,它是倆種模式都有的。實現其中一種模式的子類不必去實現它未採用的另外一種模式。

AQS定義了一個內部類ConditionObject,它用來支持獨佔模式的子類實現,幫助方法isHeldExclusively判斷是否當前線程獨佔等,除了AQS,保證沒有其餘方法建立這麼一個對象,若是你不能知足該約束就不要用AQS。ConditionObject的行爲依賴於它的具體同步實現的語義。

AQS提供了等待隊列的一些檢查,監聽等方法,固然條件對象也有。這些方法也能夠在同步實現中使用。

AQS序列化只保存state,因此反序列化後等待隊列爲空。子類應該重寫如下方法來實現同步機制,任何對同步state的修改都應該調用getState,setState或者compareAndSetState
<ul>
 * <li> {@link #tryAcquire}
 * <li> {@link #tryRelease}
 * <li> {@link #tryAcquireShared}
 * <li> {@link #tryReleaseShared}
 * <li> {@link #isHeldExclusively}
 * </ul>
上述方法默認都是拋出異常,這些方法的實現必須線程安全,通常來講不阻塞不長,子類只須要實現這些,AQS中其餘方法都已經被聲明爲final了。
相關文章
相關標籤/搜索