簡介
-
柵欄類似於閉鎖,它能阻塞一組線程直到某個事件的發生。柵欄與閉鎖的關鍵區別在於,所有的線程必須同時到達柵欄位置,才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其他線程。
-
CyclicBarrier可以使一定數量的線程反覆地在柵欄位置處彙集。當線程到達柵欄位置時將調用await方法,這個方法將阻塞直到所有線程都到達柵欄位置。如果所有線程都到達柵欄位置,那麼柵欄將打開,此時所有的線程都將被釋放,而柵欄將被重置以便下次使用。
概念解釋
-
屏障
指定數量的線程全部調用 cyclicBarrier的await()方法時,這些線程不再阻塞
-
循環
通過reset()方法可以進行重置
初始化屏障方式
-
方式一
public CyclicBarrier(int parties)
-
方式二
public CyclicBarrier(int parties, Runnable barrierAction)
設置屏障打開前首先運行的線程即該線程的執行時機是在到達屏障之後再執行
典型案例
CyclicBarrier-循環屏障-模擬多線程計算
需求
1、初始化50000條數據
2、通過5個線程並行處理 每一個線程分別處理10000條數據(通過線程池中的5個線程處理)
3、然後將5個線程分別的處理結果彙總(通過初始化柵欄的時候第二個構造函數定義的那個線程處理即Runnable barrierAction)
代碼實現及過程分析
形象解釋
方法介紹
是否被破壞
isBroken()
默認爲true
狀態被改變的場景:
1.等待線程被interrupt
2.等待線程timeout
3、其他線程調用reset(),將其重置爲true
獲取開啓屏障的方數
barrier.getParties()
獲取正在等待的線程數
barrier.getNumberWaiting()
向柵欄”報道“
-
await()
形象的理解:每有一個線程達到柵欄,就會向柵欄報道,等到齊了指定人數,柵欄就會打開,讓這些數量的線程通過
該狀態被終止的場景:
1.屏障打開
2.本線程被interrupt
3.其他等待線程被interrupted
4.其他等待線程timeout
5.其他線程調用reset()
-
await(timeout,TimeUnit)
該狀態被終止的場景:
1.屏障打開(返回true)
2.本線程被interrupt
3.本線程timeout
4.其他等待線程被interrupted
5.其他等待線程timeout
6.其他線程調用reset()
重置
reset()
將CyclicBarrier迴歸初始狀態,如果有正在等待的線程,則會拋出BrokenBarrierException異常
比較
CyclicBarrier | 線程相互等待 | 可以重置count |
---|---|---|
CountDownLatch | 當前線程等待一個或多個線程 | count=0,不可重置 |
源碼分析
核心源碼
await方法
同時,Generation描述着CyclicBarrier的更新換代。在CyclicBarrier中,同一批線程屬於同一代。當有parties個線程到達barrier之後,generation就會被更新換代。其中broken標識該當前CyclicBarrier是否已經處於中斷狀態。
默認barrier是沒有損壞的。當barrier損壞了或者有一個線程中斷了,則通過breakBarrier()來終止所有的線程
源碼核心技術點
ReentrantLock
這裏先簡單介紹下和synchronized區別 下一節再詳細的說下
(1)synchronized是獨佔鎖,加鎖和解鎖的過程自動進行,易於操作,但不夠靈活。ReentrantLock也是獨佔鎖,加鎖和解鎖的過程需要手動進行,不易操作,但非常靈活。
(2)synchronized可重入,因爲加鎖和解鎖自動進行,不必擔心最後是否釋放鎖;ReentrantLock也可重入,但加鎖和解鎖需要手動進行,且次數需一樣,否則其他線程無法獲得鎖。
(3)synchronized不可響應中斷,一個線程獲取不到鎖就一直等着;ReentrantLock可以相應中斷。
(4)ReentrantLock還可以實現公平鎖機制 通俗的理解就是誰排隊時間最長誰先執行獲取鎖
代碼資源
https://gitee.com/pingfanrenbiji/myconcurrent/blob/master/src/main/java/pers/hanchao/concurrent/eg15/CyclicBarrierDemo.java
參考文章
https://blog.csdn.net/qq_38293564/article/details/80558157
https://baijiahao.baidu.com/s?id=1648624077736116382&wfr=spider&for=pc
本文使用 mdnice 排版