CountDownLatch vs CyclicBarrier

CountDownLatch:允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
构造函数:
CountDownLatch(int count)
构造一个以给定计数CountDownLatch。

CyclicBarrier:允许一组线程全部等待彼此达到共同屏障点的同步辅助。
构造函数:
CyclicBarrier(int parties)
创建一个新的 CyclicBarrier ,当给定数量的线程(线程)等待它时,它将跳闸,并且当屏障跳闸时不执行预定义的动作。
CyclicBarrier(int parties, Runnable barrierAction)
创建一个新的 CyclicBarrier ,当给定数量的线程(线程)等待时,它将跳闸,当屏障跳闸时执行给定的屏障动作,由最后一个进入屏障的线程执行。

区别:
1、
CountDownLatch:使用给定的“计数”初始化。await方法阻塞,直到由于countDown()方法的 调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await调用立即返回。 这是一个一次性的现象 - 计数无法重置。
CyclicBarrier:被称为循环 ,因为它可以在等待的线程被释放之后重新使用,例如如:如果初始化参数为3,那么第4个线程使用await后,会继续阻塞,直到再有两个线程调用await方法后返回。

2、
CountDownLatch:线程在await过程中,等待的是“操作”(countDown),等待指定个数的countDown,无论该操作是由哪个线程触发。
CyclicBarrier:线程在await过程中,等待的“线程”(await),等待指定个数的线程await。
即:CountDownLatch - > NumberOfCalls
CyclicBarrier - > NumberOfThreads

3、CyclicBarrier对失败的同步尝试使用all-or-none断裂模型:如果线程由于中断,故障或超时而过早离开障碍点,那么在该障碍点等待的所有其他线程也将通过BrokenBarrierException或InterruptedException异常离开。

image.png

参考:
1、http://www.matools.com/api/java8
2、https://stackoverflow.com/questions/4168772/java-concurrency-countdown-latch-vs-cyclic-barrier

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容