使用總結
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...