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