「每天一道面試題」CountDownLatch和CyclicBarrier的異同?

「每天一道面試題」CountDownLatch和CyclicBarrier的異同?

相同點:都可以實現線程間的等待。

不同點:

  1. 側重點不同,CountDownLatch一般用於一個線程等待一組其它線程;而CyclicBarrier一般是一組線程間的相互等待至某同步點;

  2. CyclicBarrier的計數器是可以重用的,而CountDownLatch不可以。

  3. 實現原理不同

    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等於零則喚醒等待隊 中的線程。


分享到:


相關文章: