允许一组线程全部等待彼此达到共同屏障点的同步辅助。就像跑步比赛,等所有运动员都到达终点,才把成绩给报上去。
独占锁
源码分析
await()
所有的线程到这儿就暂停等待,等所有的线程都执行到这儿之后,才能执行下面的操作。
如果当前线程不是最后一个线程,那么它被禁用以进行线程调度,并且处于休眠状态,知道发生下列事情之一:
- 最后一个线程到达
- 一些其他线程当前线程为interrupt
- 一些其他线程interrupt其他等待线程之一
- 一些其他线程在等待屏障时超时
- 其他一些线程在这个屏障上调用reset()
使用场景
单元测试并发的时候,可以使用该类。
static AtomicInteger i = new AtomicInteger(0);
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
for ( int i = 0; i < 30; i++) {
new Thread(() -> {
try{
cyclicBarrier.await();
print();
}catch(Exception e){
}
}).start();
}
}
private static void print(){
if(i.getAndIncrement() % 2 ==0){
System.out.println("do task...");
}else {
System.out.println("sleep...");
}
}