CyclicBarrier和CountDownLatch?

时间:2012-04-25 14:17:23

标签: countdownlatch cyclicbarrier

CyclicBarrier和CountDownLatch有什么区别?我认为存在细微差别,因为两者看起来都相同。

如果我错了,请告诉我,并解释一下。

1 个答案:

答案 0 :(得分:1)

CountDownLatch用于一次性同步。使用CountDownLatch时,允许任何线程多次调用countDown()。调用await()的线程被阻塞,直到计数达到零,因为其他未阻塞的线程调用了countDown()。 javadoc for CountDownLatch州:

  

await方法阻塞,直到当前计数达到零为止   调用countDown()方法,之后所有等待的线程   被释放,随后的任何调用等待返回   立即。   ...

     

另一种典型用法是将问题分成N个部分,   用执行该部分的Runnable描述每个部分   向下计数锁存器,并将所有Runnables排队到Executor。   当所有子部件都完成后,协调线程就可以了   通过等待。 (当线程必须重复倒计时   这样,改为使用CyclicBarrier。)

相反,循环屏障用于多个同步点,例如,如果一组线程正在运行循环/分阶段计算,并且需要在开始下一个迭代/阶段之前进行同步。根据{{​​3}}:

  

屏障被称为循环,因为它可以在之后重复使用   等待线程被释放。

与CountDownLatch不同,对await()的每次调用都属于某个阶段,并且可能导致线程阻塞,直到属于该阶段的所有各方都调用await()。 CyclicBarrier不支持显式的countDown()操作。