相同點:都可以實現線程間的等待。
不同點:
側重點不同,CountDownLatch一般用於一個線程等待一組其它線程;而CyclicBarrier一般是一組線程間的相互等待至某同步點;
CyclicBarrier的計數器是可以重用的,而CountDownLatch不可以。
實現原理不同
CyclicBarrier:如果有三個線程thread1、thread2和thread3,假設線程執行順序是thread1、thread2、thread3,那麼thread1、thread2對應的Node節點會被加入到Condition等待隊列中,當thread3執行的時候,會將thread1、thread2對應的Node節點按thread1、thread2順序轉移到AQS同步隊列中,thread3執行lock.unlock()的時候,會先喚醒thread1,thread1恢復繼續執行,thread1執行到lock.unlock()的時候會喚醒thread2恢復執行。
CountDownLatch:使 CountDownLatch(int count)構建CountDownLatch實 ,將count參數賦值給內部計數 state,調 await() 法阻塞當前線程,並將當前線程封裝加到等待隊 中,直到state等於零或當前線程被中斷;調 countDown() 法使state值減 ,如果state等於零則喚醒等待隊 中的線程。
閱讀更多 Java實戰技術 的文章