在網上看到很多人對於CountDownLatch和CyclicBarrier的區別簡單理解爲CountDownLatch是一次性的,而CyclicBarrier在調用reset之後還可以繼續使用。那如果只是這麼簡單的話,我覺得CyclicBarrier簡單命名爲ResetableCountDownLatch好了,顯然不是的。
我的理解是,要從他們的設計目的去看這兩個類。javadoc裏面的描述是這樣的。
CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
可能是我的英語不夠好吧, 我感覺從這個javadoc裏面要準確理解他們的差異還是不容易的。
我的理解是
CountDownLatch : 一個線程(或者多個), 等待另外N個線程完成某個事情之後才能執行。 CyclicBarrier : N個線程相互等待,任何一個線程完成之前,所有的線程都必須等待。
這樣應該就清楚一點了,對於CountDownLatch來說,重點是那個“一個線程”, 是它在等待, 而另外那N的線程在把“某個事情”做完之後可以繼續等待,可以終止。而對於CyclicBarrier來說,重點是那N個線程,他們之間任何一個沒有完成,所有的線程都必須等待。
CountDownLatch 是計數器, 線程完成一個就記一個, 就像 報數一樣, 只不過是遞減的.
而CyclicBarrier更像一個水閘, 線程執行就想水流, 在水閘處都會堵住, 等到水滿(線程到齊)了, 纔開始泄流.
網址: http://xumingming.sinaapp.com/215/countdownlatch-vs-cyclicbarrier/