java多線程并發(fā)編程之CountDownLatch

CountDownLatch簡介

官方標(biāo)注:

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

CountDownLatch是java.util.concurrent包中的并發(fā)組件。

CountDownLatch這個(gè)類能夠使一個(gè)線程等待其他線程完成各自的工作后再執(zhí)行,相當(dāng)于1.5時(shí)代的Thread.join()。在1.6時(shí)代之后,推出了juc包,提供了線程池以及并發(fā)組件等api,join操作現(xiàn)在很少調(diào)用,所以在多線程調(diào)度中,CountDownLatch使用還是比較頻繁的,合理的運(yùn)用CountDownLatch以及線程池調(diào)度,能夠顯著的提高系統(tǒng)性能,并行處理任務(wù)。

CountDownLatch使用方式

舉個(gè)栗子:

CountDownLatch-V1

如上圖:博主開啟了五個(gè)線程去調(diào)度,以Thread.sleep來模擬真實(shí)的耗時(shí)操作。

最后在主線程join子線程結(jié)束,以打印順序來論證CountDownLatch的作用。

CountDownLatch-V2

如上圖:當(dāng)博主將await最大等待時(shí)間調(diào)整為1000毫秒,這個(gè)時(shí)間小于子線程task執(zhí)行時(shí)長,運(yùn)行結(jié)果可以看到,主線程沒有等待所有線程執(zhí)行完畢再執(zhí)行44行代碼,這個(gè)就是CountDownLatch的await方法傳入最大等待時(shí)長的結(jié)果,在某些場景,可以用這個(gè)方式去控制阻塞時(shí)間。

CountDownLatch源碼解析

CountDownLatch源碼

如圖:可以看到CountDownLatch底層是AQS

/**

* Synchronization control For CountDownLatch.

* Uses AQS state to represent count.

*/

AbstractQueuedSynchronizer,隊(duì)列同步器,簡稱AQS,它是java并發(fā)用來構(gòu)建鎖或者其他同步組件的基礎(chǔ)框架。

關(guān)于AQS博主打算另開一篇博文介紹,這里就簡單帶過。

在CountDownLatch的源碼設(shè)計(jì)里,是利用AQS做了一個(gè)標(biāo)志位設(shè)計(jì),開發(fā)了Sync靜態(tài)內(nèi)部類去繼承AbstractQueuedSynchronizer,模版設(shè)計(jì)模式。在構(gòu)造方法里設(shè)置好volatile變量state。


CountDownLatch源碼

如上圖: CountDownLatch利用AQS的state,在構(gòu)造進(jìn)行了初始化state設(shè)置。之后的await方法也是利用AQS自旋等待。


CountDownLatch源碼

如上圖: countDown方法更簡單,就是把標(biāo)志位的state count-1.


AbstractQueuedSynchronizer源碼

那么看到這里就很清楚了,CountDownLatch完全是建立在AQS基礎(chǔ)上,利用state做了一層CAS。只要await的時(shí)候,標(biāo)志位沒有到達(dá)0,也就是getState()!=0,就會不斷自旋,以此達(dá)到高效控制批量線程的作用。

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

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

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