CyclicBarrier 同步屏障實現分析

2021-09-24 07:51:52 字數 2844 閱讀 1658

cyclicbarrier 是可迴圈使用的屏障,主要功能是讓一組執行緒到達乙個屏障時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開啟;所有被屏障攔截的執行緒才會繼續執行。

使用示例
public

class

cyclicbarriertest

catch (interruptedexception e) catch (brokenbarrierexception e) }}

@before

public

void

init

() @test

public

void

allawait

() while (true) }}

@test

public

void

oneawaitinterrupted

()throws interruptedexception

if (cyclicbarrier.isbroken()) }}

}複製**

thread-a - 到達屏障前

thread-b - 到達屏障前

屏障中斷退出

thread-a - 等待中斷

thread-b - 屏障被破壞

thread-0 - 到達屏障前

thread-1 - 到達屏障前

thread-2 - 到達屏障前

thread-2 - 到達屏障後

thread-0 - 到達屏障後

thread-1 - 到達屏障後

test over

複製**

從 oneawaitinterrupted 方法執行結果可以看出,當乙個執行緒 a 執行中斷時,另外乙個執行緒 b 會丟擲 brokenbarrierexception

構造

// 可以指定攔截執行緒個數

public

cyclicbarrier

(int parties)

// 指定攔截執行緒個數和所有執行緒到達屏障處後執行的動作

public

cyclicbarrier

(int parties, runnable barrieraction)

複製**

實現

概念

簡單的理解就是,當執行緒都到達屏障的時候,會開啟屏障。

await()
await 說明執行緒到達屏障

public

intawait

()throws interruptedexception, brokenbarrierexception catch (timeoutexception toe)

}複製**

private

intdowait

(boolean timed, long nanos)

throws interruptedexception, brokenbarrierexception,

timeoutexception

// 到達屏障的計數減一

int index = --count;

if (index == 0) finally

}// loop until tripped, broken, interrupted, or timed out

for (;;) catch (interruptedexception ie) else

}// 屏障被破壞 則丟擲異常

if (g.broken)

throw

new brokenbarrierexception();

if (g != generation)

// g != generation 說明所有執行緒均到達屏障處 可直接返回

// 因為所有執行緒到達屏障處的時候,會重置 generation

// 參考 nextgeneration

return index;

if (timed && nanos <= 0l)

}} finally

}複製**

private

void

nextgeneration

()複製**

private

void

breakbarrier

()複製**

如下圖為 cyclicbarrier 實現效果圖:

isbroken()

返回屏障是否被破壞,也是是否被中斷

public

boolean

isbroken

() finally

}複製**

reset()
public

void

reset

() finally

}複製**

getnumberwaiting
獲取阻塞在屏障處的執行緒數

public

intgetnumberwaiting

() finally

}複製**

小結

cyclicbarrier 和 countdownlatch 功能類似,不同之處在於 cyclicbarrier 支援重複利用,而 countdownlatch 計數只能使用一次。

同步屏障CyclicBarrier

cyclicbarrier操作excel public class bankwaterservice implements runnable private void count throws exception 計算當前sheet的銀流資料,計算 省略 sheetbankwatercount.pu...

CyclicBarrier實現原理

cyclicbarrier是乙個同步輔助類,它允許一組執行緒互相等待,直到所有執行緒都到達某個公共屏障點 也可以叫同步點 即相互等待的執行緒都完成呼叫await方法,所有被屏障攔截的執行緒才會繼續執行await方法後面的程式。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時cy...

CyclicBarrier 使用詳解

從字面上的意思可以知道,這個類的中文意思是 迴圈柵欄 大概的意思就是乙個可迴圈利用的屏障。它的作用就是會讓所有執行緒都等待完成後才會繼續下一步行動。舉個例子,就像生活中我們會約朋友們到某個餐廳一起吃飯,有些朋友可能會早到,有些朋友可能會晚到,但是這個餐廳規定必須等到所有人到齊之後才會讓我們進去。這裡...