CountDownLatch and CyclicBarrier
CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
CountDownLatch和CyclicBarrier本质是一样的,都是在每个Thread 设置 CountDownLatch或CyclicBarrier 的屏障点point, 每个Thread 计入的Condition 中队列, 执行到屏障点point时候,回调 CountDownLatch或CyclicBarrier 的await方法,在Condition 中队列遍历是否所有的Thread 都已经执行到屏障点point。但是并没有释放Thread ,Thread 一致是运行状态(可以理解成时等待其他Thread全部完成屏障点point)。
区别是:
每个Thread 到达 CountDownLatch的屏障点point 可以调用 countDown()计数-1,到全部为计数0的时候,全部其他Thread通过,继续执行或结束。
所有到达 CyclicBarrier 的屏障点point 时候,该屏障点point 结束,继续执行。如果不能全部到达(中断、失败或者超时等原因),设置 BrokenBarrierException引起所有调用await方法的“Thread”全部报错,全部要么全不 (all-or-none) 的破坏模式。
reset也是抛出BrokenBarrierException。
简而言之,CyclicBarrier 实现一致性,CountDownLatch简单计数。
CyclicBarrier 循环特性
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier