AbstractQueuedSynchronizer筆記

mic_saber發表於2019-04-02

Node的幾個狀態描述

	volatile int waitStatus;
	// 表示執行緒已取消
	static final int CANCELLED = 1;
	// 後繼者的執行緒需要喚起
	static final int SIGNAL = -1;
	// 執行緒在等待條件
	static final int CONDITION = -2;
	// 下一個acquireShared應無條件傳播
	static final int PROPAGATE = -3;

SIGNAL:此節點的後繼者(或將很快)被阻止(通過駐留),因此當前節點在釋放或取消時必須取消其後繼節點。為了避免競爭,獲取方法必須首先指示它們需要訊號,然後重試原子獲取,然後在失敗時阻止。

CANCELED:由於超時或中斷,此節點被取消。節點永遠不會離開這種狀態。特別是,具有已取消節點的執行緒永遠不會再次阻塞。

CONDITION :此節點當前處於條件佇列中。在傳輸之前,它不會用作同步佇列節點,此時狀態將設定為0.(此處使用此值與欄位的其他用法無關,但可簡化機制。)

PROPAGATE:releaseShared應該傳播到其他節點。在doReleaseShared中設定(僅限頭節點)以確保繼續傳播,即使其他操作已經介入。

0:以上都不是

這些值以數字方式排列以簡化使用。非負值意味著節點不需要發訊號。因此,大多數程式碼不需要檢查特定值,僅用於符號。

對於正常的同步節點,該欄位初始化為0,對於條件節點,該欄位初始化為CONDITION。它使用CAS(或者在可能的情況下,無條件的易失性寫入)進行修改。

相關文章