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綁定一個線程

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層就可以滿足

5.AQS的應(yīng)用
獨(dú)占:ReentrantLock
共享:Semaphore、CountDownLatch