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 方法,當兩個執行緒都到達同步點後,這兩個執行緒就可以交換資...