在網上看到不少人對於CountDownLatch和CyclicBarrier的區別簡單理解爲CountDownLatch是一次性的,而CyclicBarrier在調用reset以後還能夠繼續使用。那若是隻是這麼簡單的話,我以爲CyclicBarrier簡單命名爲ResetableCountDownLatch好了,顯然不是的。
個人理解是,要從他們的設計目的去看這兩個類。javadoc裏面的描述是這樣的。 java
CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. spa
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個線程,他們之間任何一個沒有完成,全部的線程都必須等待。 orm
CountDownLatch 是計數器, 線程完成一個就記一個, 就像 報數同樣, 只不過是遞減的. it
而CyclicBarrier更像一個水閘, 線程執行就想水流, 在水閘處都會堵住, 等到水滿(線程到齊)了, 纔開始泄流. io