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()釋放一個許可。