AQS使用和原理解析

2021-09-10 03:44:40 字數 1854 閱讀 9935

使用總結

aqs的基本原理

concurrenthashmap

// 獨佔式獲取同步狀態,試著獲取,成功返回true,反之為false

protected

boolean

tryacquire

(int arg)

// 獨佔式釋放同步狀態,等待中的其他執行緒此時將有機會獲取到同步狀態;

protected

boolean

tryrelease

(int arg)

// 共享式獲取同步狀態,返回值大於等於0,代表獲取成功;反之獲取失敗;

protected

inttryacquireshared

(int arg)

// 共享式釋放同步狀態,成功為true,失敗為false

protected

boolean

tryreleaseshared

(int arg)

// 是否在獨佔模式下被執行緒占用。

protected

boolean

isheldexclusively

()

// 獲取同步狀態值

protected

final

intgetstate()

// 設定同步狀態值

protected

final

void

setstate

(int newstate)

// 比較同步狀態值是否為expect,是則更新為update並返回成功

protected

final

boolean

compareandsetstate

(int expect,

int update)

// 設定執行執行緒,父類abstractownablesynchronizer的方法

protected

final

void

setexclusiveownerthread

(thread thread)

// 獲取可執行許可權,不可執行則加入clh等待

public

final

void

acquire

(int arg)

// 釋放鎖,並對後續節點進行喚醒

public

final

boolean

release

(int arg)

return

false

;}

abstractqueuedsynchronizer是提供了乙個同步的模板,我們需要去繼承這個類,我們只需要去重寫什麼情況下獲取和釋放同步狀態即可,而獲取同步狀態和釋放同步狀態的具體實現則由aqs實現。所以重寫的那些方法,僅僅是一些簡單的對於共享資源state的獲取和釋放操作。

當執行緒獲取資源失敗(比如tryacquire時試圖設定state狀態失敗),會被構造成乙個結點加入clh佇列中,同時當前執行緒會被阻塞在佇列中(通過locksupport.park實現,其實是等待態)。當持有同步狀態的執行緒釋放同步狀態時,會喚醒後繼結點,然後此結點執行緒繼續加入到對同步狀態的爭奪中。

jdk1.7以後取消了segment分段鎖,採用cas和synchronized來保證併發安全。資料結構跟hashmap1.8的結構類似,陣列+鍊錶/紅黑二叉樹。

synchronized只鎖定當前鍊錶或紅黑二叉樹的首節點,這樣只要hash不衝突,就不會產生併發,效率又提公升n倍。

AQS原理解析

aqs abstractqueuesynchronizer 即 抽象佇列同步器,聽起來非常拗口,沒有關係,暫且先記住佇列 同步這兩個關鍵字,需要把它理解為乙個框架,即用來實現多執行緒訪問共享資源的同步框架。比如reentrantlock semaphore countdownlatch等等的實現都依...

AQS的原理和使用

什麼是aqs 全稱abstractqueuedsynchronizer aqs實現是基於clh佇列鎖 clh同步佇列是乙個fifo雙向佇列,這三張圖是來解釋狀態改變的過程,關於clh可以自行查詢 多個執行緒時,mypred指向上乙個儲存的執行緒,並且自循檢查前乙個執行緒是否釋放鎖,自循一定次數後進入...

CAS和AQS名稱解析。

1 cas compare and swap 解決多執行緒並 況下使用鎖造成效能損耗的一種機制,這是 硬體實現的原子操作。cas 操作包含三個運算元 記憶體位置 預期原值和新值。如果記憶體位 置的值與預期原值相匹配,那麼處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。2 aqs abst...