「每天一道面试题」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等于零则唤醒等待队 中的线程。


分享到:


相關文章: