Java中的阻塞隊(duì)列(3)同步計(jì)數(shù)器

9、同步計(jì)數(shù)器 CountDownLatch

? ? 這是一個(gè)同步的輔助類,實(shí)現(xiàn)原理為AbstractQueuedSynchronizer抽象隊(duì)列化同步器

圖9-1

? ? 方法介紹:

? ? ? ? 1、CountDownLatch(int count):構(gòu)造,并給定計(jì)數(shù)初始化

? ? ? ? 2、await():當(dāng)前線程在鎖存器倒計(jì)數(shù)到零之前一直等待,除非線程被中斷

? ? ? ? 3、await(long, TimeUnit):當(dāng)前線程在鎖存器倒計(jì)數(shù)到零之前一直等待,除非線程被中斷或者超出指定時(shí)間

? ? ? ? 4、countDown():計(jì)數(shù)減一

? ? ? ? 5、getCount():獲取當(dāng)前計(jì)數(shù)

? ? 至于例子,就通過之前寫過的并發(fā)單元測(cè)試歷程就可以

圖9-2

? ? 至于實(shí)現(xiàn)原理,我們看源碼會(huì)發(fā)現(xiàn),其實(shí)CountDownLatch也是調(diào)用了一個(gè)AbstractQueuedSynchronizer抽象隊(duì)列化同步器

10、AbstractQueuedSynchronizer抽象隊(duì)列化同步器

? ? 這是一個(gè)java.util.concurrent的核心組件之一,提供了一個(gè)基于FIFO的隊(duì)列,用于構(gòu)建鎖或者其他相關(guān)同步裝置的基礎(chǔ)框架

? ? 首先看繼承結(jié)構(gòu)如圖10-1

圖10-1

這個(gè)繼承結(jié)構(gòu)是非常簡(jiǎn)單的,但是里面包含的方法就 emmmmmmm。。。有點(diǎn)多了,而且這是一個(gè)抽象類,但是里面卻找不到任何一個(gè)抽象方法,想要使用就需要繼承這個(gè)類才行,AbstractQueuedSynchronizer分為兩種模式,排他模式和共享模式,也可以兩個(gè)模式共存,排他模式時(shí)其他線程試圖獲取該鎖將無法取得成功,共享模式則可以同時(shí)成功。

? ? 其中的方法子類可以適當(dāng)?shù)闹匦露x:

? ? ? ? 1、tryAcquire(int)、tryRelease(int):試圖在排他模式下獲?。N毀對(duì)象狀態(tài)

? ? ? ? 2、tryAcquireShared(int)、tryReleaseShared(int):試圖在排他模式下獲?。N毀對(duì)象狀態(tài)

? ? ? ? 3、isHeldExclusively():如果對(duì)于當(dāng)前正在調(diào)用的線程,同步是以排他方式進(jìn)行的,則返回true,判斷當(dāng)前正在執(zhí)行的線程是否以排他模式進(jìn)行的

? ? ? ? 4、getState()、setState(int)、compareAndSetState(int, int):通過這種方式來改變同步狀態(tài)

? ? 我們這邊提取一個(gè)官方的demo,加以說明一下

? ? ? ? 以下為L(zhǎng)ock對(duì)象的實(shí)現(xiàn)方法

普通重入鎖的執(zhí)行過程

11、同步計(jì)數(shù)器Semaphore:

? ? 這個(gè)其實(shí)就是維護(hù)了一個(gè)許可集合,其實(shí)就是在高并發(fā)下,允許幾個(gè)線程同時(shí)運(yùn)行,其余線程放入隊(duì)列,具體的應(yīng)用場(chǎng)景就是線程池,這個(gè)放在后面說明。

? ? 實(shí)現(xiàn)原理其實(shí)也很簡(jiǎn)單,底層也是通過AQS的方式,

12、同步計(jì)數(shù)器CyclicBarrier

? ? 這個(gè)需要對(duì)比著CountDownLatch來看

? ??CountDownLatch:一個(gè)線程(或者多個(gè)線程),等待另外n個(gè)線程完成某個(gè)事情之后才能執(zhí)行

? ??CyclicBarrier:n個(gè)線程互相等待,任何一個(gè)線程完成之前,其他的線程都必須等待

? ? 來看一個(gè)例子

? ? 可以看到,三個(gè)子線程先執(zhí)行,一直到三個(gè)線程都await的時(shí)候,主線程開始執(zhí)行,主線程執(zhí)行完畢之后,三個(gè)線程開始執(zhí)行await后面的任務(wù)。

? ? 至于源碼的解讀。。。。。。。還是算了吧。。。

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

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

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