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