【问题标题】:CyclicBarrier and CountDownLatch?CyclicBarrier 和 CountDownLatch?
【发布时间】:2012-05-06 06:03:34
【问题描述】:

CyclicBarrier 和 CountDownLatch 有什么区别?我觉得有细微的差别,因为两者看起来都一样。

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

【问题讨论】:

标签: countdownlatch cyclicbarrier


【解决方案1】:

CountDownLatch 用于一次性同步。在使用 CountDownLatch 时,任何线程都可以调用 countDown() 任意次数。由于其他未阻塞线程对 countDown() 的调用,调用 await() 的线程将被阻塞,直到计数达到零。 javadoc for CountDownLatch 声明:

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

另一个典型的用法是将一个问题分成 N 个部分, 用执行该部分的 Runnable 描述每个部分,并 对闩锁进行倒计时,并将所有 Runnables 排队到 Executor。 当所有子部分都完成后,协调线程将能够 通过等待。 (当线程必须在 这种方式,改为使用 CyclicBarrier。)

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

屏障被称为循环的,因为它可以在 等待线程被释放。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2014-12-07
    相关资源
    最近更新 更多