9竭沫、同步計數(shù)器 CountDownLatch
? ? 這是一個同步的輔助類拣播,實(shí)現(xiàn)原理為AbstractQueuedSynchronizer抽象隊列化同步器
? ? 方法介紹:
? ? ? ? 1糟描、CountDownLatch(int count):構(gòu)造削葱,并給定計數(shù)初始化
? ? ? ? 2亿汞、await():當(dāng)前線程在鎖存器倒計數(shù)到零之前一直等待羔沙,除非線程被中斷
? ? ? ? 3、await(long, TimeUnit):當(dāng)前線程在鎖存器倒計數(shù)到零之前一直等待伟骨,除非線程被中斷或者超出指定時間
? ? ? ? 4饮潦、countDown():計數(shù)減一
? ? ? ? 5、getCount():獲取當(dāng)前計數(shù)
? ? 至于例子携狭,就通過之前寫過的并發(fā)單元測試歷程就可以
? ? 至于實(shí)現(xiàn)原理继蜡,我們看源碼會發(fā)現(xiàn),其實(shí)CountDownLatch也是調(diào)用了一個AbstractQueuedSynchronizer抽象隊列化同步器
10逛腿、AbstractQueuedSynchronizer抽象隊列化同步器
? ? 這是一個java.util.concurrent的核心組件之一稀并,提供了一個基于FIFO的隊列,用于構(gòu)建鎖或者其他相關(guān)同步裝置的基礎(chǔ)框架
? ? 首先看繼承結(jié)構(gòu)如圖10-1
這個繼承結(jié)構(gòu)是非常簡單的单默,但是里面包含的方法就 emmmmmmm碘举。。搁廓。有點(diǎn)多了引颈,而且這是一個抽象類,但是里面卻找不到任何一個抽象方法境蜕,想要使用就需要繼承這個類才行蝙场,AbstractQueuedSynchronizer分為兩種模式,排他模式和共享模式粱年,也可以兩個模式共存售滤,排他模式時其他線程試圖獲取該鎖將無法取得成功,共享模式則可以同時成功台诗。
? ? 其中的方法子類可以適當(dāng)?shù)闹匦露x:
? ? ? ? 1完箩、tryAcquire(int)、tryRelease(int):試圖在排他模式下獲壤/銷毀對象狀態(tài)
? ? ? ? 2嗜憔、tryAcquireShared(int)、tryReleaseShared(int):試圖在排他模式下獲仁险獭/銷毀對象狀態(tài)
? ? ? ? 3吉捶、isHeldExclusively():如果對于當(dāng)前正在調(diào)用的線程夺鲜,同步是以排他方式進(jìn)行的,則返回true呐舔,判斷當(dāng)前正在執(zhí)行的線程是否以排他模式進(jìn)行的
? ? ? ? 4币励、getState()、setState(int)珊拼、compareAndSetState(int, int):通過這種方式來改變同步狀態(tài)
? ? 我們這邊提取一個官方的demo食呻,加以說明一下
? ? ? ? 以下為Lock對象的實(shí)現(xiàn)方法
11、同步計數(shù)器Semaphore:
? ? 這個其實(shí)就是維護(hù)了一個許可集合澎现,其實(shí)就是在高并發(fā)下仅胞,允許幾個線程同時運(yùn)行,其余線程放入隊列剑辫,具體的應(yīng)用場景就是線程池干旧,這個放在后面說明。
? ? 實(shí)現(xiàn)原理其實(shí)也很簡單妹蔽,底層也是通過AQS的方式椎眯,
12、同步計數(shù)器CyclicBarrier
? ? 這個需要對比著CountDownLatch來看
? ??CountDownLatch:一個線程(或者多個線程)胳岂,等待另外n個線程完成某個事情之后才能執(zhí)行
? ??CyclicBarrier:n個線程互相等待编整,任何一個線程完成之前,其他的線程都必須等待
? ? 來看一個例子
? ? 可以看到乳丰,三個子線程先執(zhí)行掌测,一直到三個線程都await的時候,主線程開始執(zhí)行产园,主線程執(zhí)行完畢之后赏半,三個線程開始執(zhí)行await后面的任務(wù)。
? ? 至于源碼的解讀淆两。。拂酣。秋冰。。婶熬。剑勾。還是算了吧。赵颅。虽另。