1.使用场景
现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。
例如:吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。
在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。
利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。
2.实现原理
CyclicBarrier 的源码实现和 CountDownLatch 非常相似;
CountDownLatch 基于 AQS 的共享模式的使用,而 CyclicBarrier 基于 Condition 来实现的。
在CyclicBarrier类的内部有一个计数器,每个线程在到达屏障点的时候都会调用await方法将自己阻塞,此时计数器会减1,当计数器减为0的时候所有因调用await方法而被阻塞的线程将被唤醒。
3.CyclicBarrier的成员变量
private static class Generation {
boolean broken = false;
}
/** The lock for guarding barrier entry */
private final ReentrantLock lock = new ReentrantLock();// 同步操作锁
/** Condition to wait on until tripped */
private final Condition trip = lock.newCondition();// 线程拦截器
/** The number of parties */
private final int parti