CyclicBarrier原理
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点(也可以叫同步点),即相互等待的线程都完成调用await方法,所有被屏障拦截的线程才会继续运行await方法后面的程序。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该屏障点在释放等待线程后可以重用,所以称它为循环的屏障点。CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达屏障点之后(但在释放所有线程之前),该命令只在所有线程到达屏障点之后运行一次,并且该命令由最后一个进入屏障点的线程执行。
CyclicBarrier中定义的成员属性
private final ReentrantLock lock = new ReentrantLock();
private final Condition trip = lock.newCondition();
private final int parties;
private final Runnable barrierCommand;
private Generation generation = new Generation();
private int count;
其核心代码是 ReentrantLock 以及 Condition 的共享唤醒线程
多个线程竞争锁,保证计数器parties为原子操作,然后当parties执行为0时候,执行方法
//唤醒所有处于休眠状态的线程,恢复执行
//重置count值为parties
//重置中断状态为true
private void breakBarrier() {
generation.broken = true;
count = parties;
trip.signalAll();
}
此时所有阻塞的线程继续执行