簡述:aqs(abstractqueuedsynchronizer)抽象的佇列同步器,其是 juc 包眾多鎖機制和訊號量機制的基礎,例如 reentrantlock、semaphore、countdownlatch、readwritelock、cyclicbarrier 底層的同步互斥操作都建立在 aqs 之上。aqs 的本質是乙個採用雙向鍊錶實現的 fifo 執行緒等待佇列,等待佇列上的執行緒釋放和等待都依據乙個整型的訊號量 volatile int state ,可以將這個訊號量視為各個執行緒所競爭的 "資源"。如下圖所示
aqs定義了一系列操作這個等待佇列的方法規範,需要定製化採用 aqs 來實現同步器亦或是自定義規則的鎖,可以先繼承 aqs 這個類,然後重寫它對於 state 變數的一系列操作(模板方法模式)。這些你可以在 reentrantlock 的原始碼裡面一**竟。
資源共享方式:aqs 提供了兩種資源共享的方式,即
獨佔(exclusive)和共享(share),獨佔的例子有 reentrantlock,共享的例子有 countdownlatch、readwritelock。
學習簡述:
1、首先執行緒進入佇列等待需要 aqs 配套實現如何將執行緒掛起和喚醒,底層用到的是 locksupport 工具類,裡面提供了 pack() 和 unpack() 兩個 native 方法來進行執行緒的掛起和喚醒
2、等待佇列的 node 都包含了什麼資訊?其主要的當然包含了執行緒資訊、執行緒狀態資訊、節點前驅後繼等,強烈建議看原始碼(英文注釋十分之好)
staticaqs 中的 nodefinal
class
node
final node predecessor() throws
nullpointerexception
node()
//將執行緒構造成乙個node,新增到等待佇列
node(thread thread, node mode)
//這個方法會在condition佇列使用,後續單獨寫一篇文章分析condition
node(thread thread, int waitstatus)
}
3、除了同步佇列,在獨佔模式下,還可以使用 condition 來讓執行緒進入條件佇列等待。說白了,就是你可以視 aqs 裡面有兩個佇列,乙個是同步佇列,裡面的執行緒等待排程獲取資源,而條件佇列是針對某一條件來讓執行緒進行等待喚醒。當位於條件佇列的執行緒被喚醒之後會被轉化到同步佇列中去,原始碼裡面有個方法 transferforsignal 就是幹這個事情的!而 aqs 中的 node 為兩用,同時可作為同步佇列的節點也可以作為條件佇列的節點,可以看原始碼說明。
4、aqs 是個模板方法模式的經典體現,定義了一些類規則方法或者說介面,讓這些具體的方法延續到子類(即各種鎖或者訊號量)去實現,那麼具體是怎麼進行實現和操作的可以看別人的部落格,但是更重要的是,部落格的說明一定要自己進去原始碼一**竟,這樣就有更深的體會
aqs 原始碼中各種方法詳解
aqs 原始碼中各種方法詳解2
併發資料結構的基石
aqs 簡單應用--自定義 mutex 互斥鎖
reentrantlock與aqs
lock與aqs
多執行緒 十六 AQS分析(二) 獲取鎖 釋放鎖
上篇部落格稍微介紹了一下aqs,下面我們來關注下aqs的所獲取和鎖釋放。aqs包含如下幾個方法 acquire int arg 以獨佔模式獲取物件,忽略中斷。acquireinterruptibly int arg 以獨佔模式獲取物件,如果被中斷則中止。acquireshared int arg 以...
AQS 執行緒 續集 喚醒 和 阻塞
接著 搶占式 共享 那裡,當 獲取鎖始終 失敗。獲取失敗,執行緒等待 具體後面介紹if shouldparkafte iledacquire p,node parkandcheckinterrupt interrupted true 在獲取同步狀態失敗後,執行緒並不是立馬進行阻塞,需要檢查該執行緒的...
多執行緒 多執行緒原理
我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...