同步工具類CyclicBarrier原理及使用

簡介

  • 柵欄相似於閉鎖,它能阻塞一組線程直到某個事件的發生。柵欄與閉鎖的關鍵區別在於,全部的線程必須同時到達柵欄位置,才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其餘線程。
  • CyclicBarrier能夠使必定數量的線程反覆地在柵欄位置處聚集。當線程到達柵欄位置時將調用await方法,這個方法將阻塞直到全部線程都到達柵欄位置。若是全部線程都到達柵欄位置,那麼柵欄將打開,此時全部的線程都將被釋放,而柵欄將被重置以便下次使用。

概念解釋

  • 屏障

指定數量的線程所有調用 cyclicBarrier的await()方法時,這些線程再也不阻塞java

  • 循環

經過reset()方法能夠進行重置git

初始化屏障方式

  • 方式一

public CyclicBarrier(int parties)多線程

  • 方式二

    `public CyclicBarrier(int parties, Runnable barrierAction)
    設置屏障打開前首先運行的線程即該線程的執行時機是在到達屏障以後再執行`ide

典型案例

CyclicBarrier-循環屏障-模擬多線程計算

需求

`一、初始化50000條數據
二、經過5個線程並行處理 每個線程分別處理10000條數據(經過線程池中的5個線程處理)
三、而後將5個線程分別的處理結果彙總(經過初始化柵欄的時候第二個構造函數定義的那個線程處理即Runnable barrierAction)`函數

代碼實現及過程分析

形象解釋

方法介紹

是否被破壞

`isBroken()
默認爲true
狀態被改變的場景:
1.等待線程被interrupt
2.等待線程timeout
三、其餘線程調用reset(),將其重置爲true`源碼分析

獲取開啓屏障的方數

barrier.getParties()spa

獲取正在等待的線程數

barrier.getNumberWaiting().net

向柵欄」報道「

  • 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()`code

重置

`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_3829...
https://baijiahao.baidu.com/s...`

本文使用 mdnice 排版

相關文章
相關標籤/搜索