AQS(AbstractQueuedSynchronizer)是Java中用于構(gòu)建同步器的框架,它提供了一種實(shí)現(xiàn)各種同步器的通用框架,例如ReentrantLock、Semaphore、CountDownLatch等等。
AQS框架的核心思想是使用一個(gè)雙向鏈表來(lái)維護(hù)等待線程隊(duì)列,同時(shí)使用一個(gè)狀態(tài)變量來(lái)表示當(dāng)前同步器的狀態(tài)。當(dāng)線程請(qǐng)求獲取同步器的鎖時(shí),如果同步器已經(jīng)被占用,那么線程就會(huì)被加入等待隊(duì)列中,并阻塞自己,等待被喚醒;如果同步器未被占用,則線程直接獲取同步器的鎖,并將同步器的狀態(tài)設(shè)置為“已占用”。
?
下面是一個(gè)簡(jiǎn)單的示例,演示了如何使用 AQS 框架來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)數(shù)器:
import?java.util.concurrent.locks.AbstractQueuedSynchronizer;public?class?Counter?{????private?final?Sync?sync?=?new?Sync();????public?void?increment()?{????????sync.acquire(1);????????try?{????????????//?進(jìn)行計(jì)數(shù)器加一操作????????}?finally?{????????????sync.release(1);????????}????}????public?int?getCount()?{????????return?sync.getCount();????}????private?static?class?Sync?extends?AbstractQueuedSynchronizer?{????????private?static?final?long?serialVersionUID?=?1L;????????protected?boolean?tryAcquire(int?arg)?{????????????return?compareAndSetState(0,?arg);????????}????????protected?boolean?tryRelease(int?arg)?{????????????int?c?=?getState()?-?arg;????????????if?(c?==?0)?{????????????????return?true;????????????}????????????if?(c?0)?{????????????????throw?new?IllegalStateException("Counter?underflow");????????????}????????????setState(c);????????????return?false;????????}????????public?int?getCount()?{????????????return?getState();????????}????}}
在上面的示例中,Counter類(lèi)包含一個(gè)Sync類(lèi)的實(shí)例,它繼承了AbstractQueuedSynchronizer并實(shí)現(xiàn)了 tryAcquire()、tryRelease()方法。increment()方法首先嘗試獲取同步器的鎖(即調(diào)用 acquire() 方法),然后進(jìn)行計(jì)數(shù)器加一操作,最后釋放同步器的鎖(即調(diào)用release() 方法)。getCount()方法返回當(dāng)前計(jì)數(shù)器的值,即同步器的狀態(tài)。
Copyright ? 2013-2021 河南云和數(shù)據(jù)信息技術(shù)有限公司 豫ICP備14003305號(hào) ISP經(jīng)營(yíng)許可證:豫B-20160281