并發(fā)包同步器的核心AQS-初探

AQS是啥

????Java中的大部分同步類(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(簡稱為AQS)實(shí)現(xiàn)的。AQS是一種提供了原子式管理同步狀態(tài)、阻塞和喚醒線程功能以及隊列模型的簡單框架。

核心思想

????如果被請求的共享資源空閑,那么就將當(dāng)前請求資源的線程設(shè)置為有效的工作線程,將共享資源設(shè)置為鎖定狀態(tài);如果共享資源被占用,就需要一定的阻塞等待喚醒機(jī)制來保證鎖分配。這個機(jī)制主要用的是CLH隊列的變體實(shí)現(xiàn)的,將暫時獲取不到鎖的線程加入到隊列中。AQS是通過將每條請求共享資源的線程封裝成一個節(jié)點(diǎn)來實(shí)現(xiàn)鎖的分配。

核心組成

1.CLH隊列

????CLH同步隊列是一個FIFO雙向隊列,AQS依賴它來完成同步狀態(tài)的管理,當(dāng)前線程如果獲取同步狀態(tài)失敗時,AQS則會將當(dāng)前線程已經(jīng)等待狀態(tài)等信息構(gòu)造成一個節(jié)點(diǎn)(Node)并將其加入到CLH同步隊列,同時會阻塞當(dāng)前線程,當(dāng)同步狀態(tài)釋放時,會把首節(jié)點(diǎn)喚醒(公平鎖),使其再次嘗試獲取同步狀態(tài)。

2.Node

????AQS的靜態(tài)內(nèi)部類,CLH隊列的節(jié)點(diǎn),每個Node綁定一個線程

Node的屬性
3.同步狀態(tài)State

????用于展示當(dāng)前臨界資源的獲鎖情況。
????當(dāng)state>0時表示已經(jīng)獲取了鎖,當(dāng)state = 0無鎖。它提供了三個方法(getState()、setState(int newState)、compareAndSetState(int expect,int update))來對同步狀態(tài)state進(jìn)行操作,可以確保對state的操作是安全的。

4.AQS API

引用美團(tuán)技術(shù)團(tuán)隊博客的AQS API架構(gòu)圖,我們自定義的同步器只需要調(diào)用API層就可以滿足


API架構(gòu)圖
5.AQS的應(yīng)用

獨(dú)占:ReentrantLock
共享:Semaphore、CountDownLatch

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容