Java併發程式設計之CyclicBarrier

2021-08-26 20:34:53 字數 2327 閱讀 3786

cyclicbarrier是乙個同步工具類,它允許一組執行緒互相等待,直到到達某個公共屏障點。與countdownlatch不同的是該barrier在釋放等待執行緒後可以重用,所以稱它為迴圈(cyclic)的屏障(barrier)。

cyclicbarrier支援乙個可選的runnable命令,在一組執行緒中的最後乙個執行緒到達之後(但在釋放所有執行緒之前),該命令只在每個屏障點執行一次。若在繼續所有參與執行緒之前更新共享狀態,此屏障操作很有用。

提供的方法:

//parties表示屏障攔截的執行緒數量,當屏障撤銷時,先執行barrieraction,然後在釋放所有執行緒

public cyclicbarrier(int parties, runnable barrieraction)

//barrieraction預設為null

public cyclicbarrier(int parties)

/* *當前執行緒等待直到所有執行緒都呼叫了該屏障的await()方法

*如果當前執行緒不是將到達的最後乙個執行緒,將會被阻塞。解除阻塞的情況有以下幾種

* 1)最後乙個執行緒呼叫await()

* 2)當前執行緒被中斷

3)其他正在該cyclicbarrier上等待的執行緒被中斷

4)其他正在該cyclicbarrier上等待的執行緒超時

5)其他某個執行緒呼叫該cyclicbarrier的reset()方法

*如果當前執行緒在進入此方法時已經設定了該執行緒的中斷狀態或者在等待時被中斷,將丟擲interruptedexception,並且清除當前執行緒的已中斷狀態。

*如果任何執行緒在等待時被中斷,則其他所有等待執行緒都將丟擲 brokenbarrierexception 異常,並將 barrier 置於損壞狀態。 *如果當前執行緒是最後乙個將要到達的執行緒,並且構造方法中提供了乙個非空的屏障操作(barrieraction),那麼在允許其他執行緒繼續執行之前,當前執行緒將執行該操作。如果在執行屏障操作過程中發生異常,則該異常將傳播到當前執行緒中,並將 barrier 置於損壞狀態。

* *返回值為當前執行緒的索引,0表示當前執行緒是最後乙個到達的執行緒

*/public int await() throws interruptedexception, brokenbarrierexception

//在await()的基礎上增加超時機制,如果超出指定的等待時間,則丟擲 timeoutexception 異常。如果該時間小於等於零,則此方法根本不會等待。

public int await(long timeout, timeunit unit) throws interruptedexception, brokenbarrierexception, timeoutexception

//將屏障重置為其初始狀態。如果所有參與者目前都在屏障處等待,則它們將返回,同時丟擲乙個brokenbarrierexception。

public void reset()

對於失敗的同步嘗試,cyclicbarrier 使用了一種要麼全部要麼全不 (all-or-none) 的破壞模式:如果因為中斷、失敗或者超時等原因,導致執行緒過早地離開了屏障點,那麼在該屏障點等待的其他所有執行緒也將通過 brokenbarrierexception(如果它們幾乎同時被中斷,則用 interruptedexception)以反常的方式離開。

使用示例:

每個worker處理矩陣中的一行,在處理完所有的行之前,該執行緒將一直在屏障處等待。在各個worker處理完所有行後,將執行提供的runnable屏障操作。

class solver 

public void run() catch (interruptedexception ex) catch (brokenbarrierexception ex) }}

}public solver(float matrix)

});for (int i = 0; i < n; ++i)

new thread(new worker(i)).start();

waituntildone();

}}

基於reentrantlock和condition機制實現。除了getparties()方法,cyclicbarrier的其他方法都需要獲取鎖。

1)countdownlatch:乙個執行緒(或者多個),等待另外n個執行緒完成某個事情之後才能執行;cyclicbarrier:n個執行緒相互等待,任何乙個執行緒完成之前,所有的執行緒都必須等待。

2)countdownlatch:一次性的;cyclicbarrier:可以重複使用。

3)countdownlatch基於aqs;cyclicbarrier基於鎖和condition。本質上都是依賴於volatile和cas實現的。

java併發程式設計之Exchanger

exchanger v 可以交換的物件型別 可以在對中對元素進行配對和交換的執行緒的同步點。每個執行緒將條目上的某個方法呈現給 exchange 方法,與夥伴執行緒進行匹配,並且在返回時接收其夥伴的物件。exchanger 可能被視為 synchronousqueue 的雙向形式。exchanger...

java併發程式設計之Synchronized關鍵字

1.synchronized關鍵字使用前介紹 1 使用synchronized關鍵字修飾方法,ps 在這裡要特別需要注意的是,當有兩個或者以上執行緒的時候,其中有乙個執行緒獲取了該方法的物件鎖執行同步方法的時候,其他的執行緒仍然可以訪問其他的非使用synchronized的方法,也就是非同步的了。2...

java併發程式設計之synchronized

上篇部落格沒寫好,排版改了好多次,看著實在頭疼所以就沒準備往下寫了,今天講下同步使用到的關鍵字synchronized,這個關鍵字可以是用在方法上,也可以使用再 塊上,synchronized作用在方法上,它的鎖物件是當前例項物件 public class syncthreadtest implem...