CyclicBarrier和CountDownLatch有什么区别?我认为存在细微差别,因为两者看起来都相同。
如果我错了,请告诉我,并解释一下。
答案 0 :(得分:1)
CountDownLatch用于一次性同步。使用CountDownLatch时,允许任何线程多次调用countDown()。调用await()的线程被阻塞,直到计数达到零,因为其他未阻塞的线程调用了countDown()。 javadoc for CountDownLatch州:
await方法阻塞,直到当前计数达到零为止 调用countDown()方法,之后所有等待的线程 被释放,随后的任何调用等待返回 立即。 ...
另一种典型用法是将问题分成N个部分, 用执行该部分的Runnable描述每个部分 向下计数锁存器,并将所有Runnables排队到Executor。 当所有子部件都完成后,协调线程就可以了 通过等待。 (当线程必须重复倒计时 这样,改为使用CyclicBarrier。)
相反,循环屏障用于多个同步点,例如,如果一组线程正在运行循环/分阶段计算,并且需要在开始下一个迭代/阶段之前进行同步。根据{{3}}:
屏障被称为循环,因为它可以在之后重复使用 等待线程被释放。
与CountDownLatch不同,对await()的每次调用都属于某个阶段,并且可能导致线程阻塞,直到属于该阶段的所有各方都调用await()。 CyclicBarrier不支持显式的countDown()操作。