CyclicBarrier可以让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,所有被屏障拦截的线程才会继续运行。
CountDownLatch和CyclicBarrier的区别
- CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许一组线程相互等待。
- CountDownLatch的计数器无法被重置,只能使用一次;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier,能处理更为复杂的业务场景。
- CountDownLatch通过自定义同步器(共享锁)实现的;而CyclicBarrier是通过重入锁ReentrantLock(排他锁)和Condition的等待通知机制来实现的。
源码分析
依赖
CyclicBarrier是通过重入锁ReentrantLock和Condition实现的。1234/** The lock for guarding barrier entry */private final ReentrantLock lock = new ReentrantLock();/** Condition to wait on until tripped */private final Condition trip = lock.newCondition();
构造方法
|
|
await()
|
|
在CyclicBarrier中,同一批的线程属于同一代,即同一个Generation;CyclicBarrier中通过generation对象,记录属于哪一代。
当有parties个线程到达barrier,generation就会被更新换代。
实例
没有老板,几个工人各做各的事,但是每个工人必须在达到 barrier(比如工作时间满了1小时) 时等待其他工人也达到这个 barrier(调用await()
方法),每个工人再重新开始继续下面的工作。