跳转到内容

2. CyclicBarrier同步器


CyclicBarrierJava 并发包 (java.util.concurrent) 里提供的一种 同步工具类,字面意思就是可循环使用的栅栏

  • Barrier(栅栏):想象一群人要等齐了才能出发,大家都到齐之前,谁先到谁就要在栅栏这等着。

  • Cyclic(循环的):这个栅栏不是一次性的,用完后可以重置,下次还能再用。

让一组线程(数量固定)在某个屏障点 相互等待,直到所有线程都到达了这个屏障点,才会一起继续往下执行。

典型场景:

  • 多个线程分阶段工作 → 在某个阶段必须等所有线程完成,才能进入下一阶段。

  • 多线程任务需要“对齐”执行,例如并行计算、模拟赛跑、分布式任务合并结果。

假设有 5 个运动员(线程),他们要跑接力赛,必须等大家都到起点,裁判一声令下,才一起开跑。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
int count = 5;
// 定义一个栅栏,5个线程都到达后,执行barrierAction
CyclicBarrier barrier = new CyclicBarrier(count, () -> {
System.out.println("所有人到齐,比赛开始!");
});
for (int i = 1; i <= count; i++) {
final int id = i;
new Thread(() -> {
try {
System.out.println("运动员 " + id + " 到达起点,等待中...");
barrier.await(); // 等待其他线程
System.out.println("运动员 " + id + " 开始跑步!");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}

运行结果(顺序可能不同):

运动员 1 到达起点,等待中...
运动员 2 到达起点,等待中...
运动员 3 到达起点,等待中...
运动员 4 到达起点,等待中...
运动员 5 到达起点,等待中...
所有人到齐,比赛开始!
运动员 3 开始跑步!
运动员 5 开始跑步!
运动员 2 开始跑步!
运动员 1 开始跑步!
运动员 4 开始跑步!

很多人容易混淆 CyclicBarrierCountDownLatch

特点CyclicBarrierCountDownLatch
等待机制一组线程互相等待,直到都到齐一个或多个线程等待,直到计数器归零
是否可复用可复用(循环使用)一次性,计数归零就报废
触发点所有线程都调用 await()主线程/工作线程调用 countDown()