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

? ? 方法介紹:
? ? ? ? 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è)試歷程就可以

? ? 至于實(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

這個(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)方法


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ù)。
? ? 至于源碼的解讀。。。。。。。還是算了吧。。。