CountDownLatch,CyclicBarrier,Semaphore與AQS

AQS:AbstractQueuedSynchronizer,抽象隊列同步器,它是構建鎖或者其他同步組件的基礎框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等)。

使用方法是創(chuàng)建自定義的鎖類,然后在鎖內部實現(xiàn)內部類繼承AQS,并實現(xiàn)AQS的固定方法。

AQS使用一個int類型的成員變量state來表示同步狀態(tài),當state>0時表示已經(jīng)獲取了鎖,當state = 0時表示釋放了鎖。它提供了三個方法(getState()、setState(int newState)、compareAndSetState(int expect,int update))來對同步狀態(tài)state進行操作,當然AQS可以確保對state的操作是安全的。

AQS通過內置的FIFO同步隊列來完成資源獲取線程的排隊工作,如果當前線程獲取同步狀態(tài)失敗(鎖)時,AQS則會將當前線程以及等待狀態(tài)等信息構造成一個節(jié)點(Node)并將其加入同步隊列,同時會阻塞當前線程,當同步狀態(tài)釋放時,則會把節(jié)點中的線程喚醒,使其再次嘗試獲取同步狀態(tài)。

獨占式同步狀態(tài)重要方法:

Acquire:嘗試獲取鎖

tryRelease: 嘗試釋放同步狀態(tài)

共享式同步狀態(tài)重要方法:

acquireShared: 嘗試獲取鎖

releaseShared: 釋放共享同步狀態(tài)

當需要阻塞或者喚醒一個線程的時候,AQS都是使用LockSupport這個工具類來完成的。LockSupport是用來創(chuàng)建鎖和其他同步類的基本線程阻塞原語,park阻塞當前線程,unpark喚起某個線程

CountDownLatch

最重要的方法是await,調用await方法的線程會被掛起,線程會等待只到count值為0才繼續(xù)執(zhí)行,一旦count被減為0,就無法再繼續(xù)使用

CyclicBarrier

回環(huán)柵欄,通過它可以實現(xiàn)讓一組線程等待至barrier狀態(tài)之后再全部同時執(zhí)行,可以被重復使用。他也有一個await方法,一旦被調用之后,該線程就處于barrier狀態(tài)了。

Semaphore

信號量,Semaphore可以控制同時訪問線程的個數(shù),通過acquire()方法獲取一個許可,如果沒有許可該線程就阻塞,使用許可完成之后,調用release()釋放一個許可。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容