Ch16-Java tools 之 CyclicBarrier
April 1, 2020
java.util.concurrent.CyclicBarrier
底层基于 ReentrantLock 和 Condition 实现,如果 count 不为 0,则调用 Condition 的 await 方法让线程等待执行,当 count 为 0 时,调用 Condition 的 singleAll 唤醒全部等待的线程执行。
1. 重要变量 #
CyclicBarrier 中的 Sync 继承自 AQS,因此其临界资源为 AQS 中的 state 定义为 Count 次数(拦截线程计数器)。
2. 核心接口 #
public class CyclicBarrier {
private final ReentrantLock lock = new ReentrantLock();
private Generation generation = new Generation();
public int await();
public int await(long timeout, TimeUnit unit);
public void countDown();
}
每个线程调用 await 方法时,count 就会减 1,如果 count 不为 0,调用 await 的线程等待执行,如果 count 为 0,所有调用 await 方法的线程被唤醒执行。