Java併發工具類之CyclicBarrier

2021-08-09 20:43:16 字數 2342 閱讀 2424

cyclicbarrier的意思是可迴圈使用的屏障。它可以讓一組執行緒到達乙個屏障時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開門,所有阻塞的執行緒才會繼續執行。

它就好像一道關卡,只有所有的部隊(執行緒)都到了才能放行。

部分原始碼:

public

class

cyclicbarrier

....

}

可以看到,cyclicbarrier是基於reentrantlock和condition實現的。建構函式

cyclicbarrier有兩個建構函式:

public

cyclicbarrier(int parties)

public

cyclicbarrier(int parties, runnable barrieraction)

第乙個構造函式呼叫的其實也是第二個建構函式,只是第二個引數barrieraction為null。這個引數其實是乙個執行緒任務命令,用於在所有執行緒到達屏障時,優先執行該執行緒任務,方便處理更加複雜的業務場景。

await()方法:

每當乙個執行緒呼叫await()方法表示該執行緒到達屏障,

public

intawait() throws interruptedexception, brokenbarrierexception catch (timeoutexception toe)

}

進入dowait()方法:

private

int dowait(boolean timed, long nanos)

throws interruptedexception, brokenbarrierexception,

timeoutexception

//每當執行緒進入,計數-1

intindex = --count;

if (index == 0) finally

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

//自旋

for (;;) catch (interruptedexception ie) else

}//當前generation「已損壞」,丟擲異常

if (g.broken)

throw

new brokenbarrierexception();

//generation已經更新,返回index

if (g != generation)

return

index;

//「超時等待」,並且時間已到,終止cyclicbarrier,並丟擲異常

if (timed && nanos <= 0l)

}} finally

}

dowait()的主要處理邏輯如下:如果該執行緒不是到達的最後乙個執行緒,則它會一直處於等待狀態,除非發生以下情況:最後乙個執行緒到達,即index == 0

超出了指定時間(超時等待)

其他的某個執行緒中斷當前執行緒

其他的某個執行緒中斷另乙個等待的執行緒

其他的某個執行緒在等待barrier超時

其他的某個執行緒在此barrier呼叫reset()方法。reset()方法用於將屏障重置為初始狀態。

generation物件描述著cyclicbarrier的更新換代。在cyclicbarrier中,同一批執行緒屬於同一代。當有parties個執行緒到達barrier,generation就會被更新換代。

cyclicbarrier允許一系列執行緒相互等待對方到達屏障,先到達的執行緒被阻塞在屏障前,必須等到所有執行緒都到達了屏障,所有執行緒才能執行;countdownlatch允許乙個或多個執行緒等待一些特定的操作完成,而這些操作是在其它的執行緒中進行的,只有「被等的執行緒」的操作完成後,「等待的執行緒」才能執行;

cyclicbarrier強調的是n個執行緒互相等待,countdownlatch強調的是1個執行緒或n個執行緒等待其他執行緒操作。

cyclicbarrier的計數器可以迴圈使用(出現錯誤可重置計數),countdownlatch的計數器只能用一次;

cyclicbarrier可以在所有執行緒到達屏障後先執行乙個執行緒任務,再執行所有執行緒,用於處理複雜的業務,countdownlatch不可以。

Java併發工具類

目錄 1.等待多執行緒完成的countdownlatch 2.同步屏障cyclicbarrier 3.控制併發執行緒數的semaphore 4.執行緒間交換資料的exchanger countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作,類似於join方法。join的實現原理是不停的...

併發工具類之 CyclicBarrier

cyclicbarrier 字面意思是可迴圈 cyclic 的屏障 barrier 它要做的事情是讓一組執行緒到達屏障時被阻塞,直到最後乙個執行緒也到達屏障,屏障才會開門,所有被屏障攔截的執行緒才會繼續執行。cyclicbarrier 有兩個構造方法,我們先來看第乙個 cyclicbarrier i...

併發工具類之 Exchanger

exchanger 交換者 是乙個用於執行緒間協作的工具類。exchanger 用於進行執行緒間的資料交換。兩個執行緒通過exchange 方法交換資料,第乙個執行緒執行到exchange 方法後會一直等待第二個執行緒也執行exchange 方法,當兩個執行緒都到達同步點後,這兩個執行緒就可以交換資...