CyclicBarrier 是 Java 并发包中可重用的线程同步工具,用于让多个线程在屏障点等待齐后共同继续执行;初始化指定参与线程数,可选屏障动作,支持超时和中断处理,异常后需调用 reset() 恢复。

CyclicBarrier 是 Java 并发包中用于协调多个线程在某个“屏障点”同步等待的工具,特别适合需要反复执行阶段性协作的场景(比如多轮并行计算、分批次处理任务)。它比 CountDownLatch 更灵活,因为可以重用——一次 await 后不会失效,能多次触发。
初始化与基本用法
创建 CyclicBarrier 时需指定参与线程数(parties),还可选传入一个 Runnable 作为“屏障动作”——当最后一个线程调用 await() 到达屏障时,会先执行该动作,再一起放行所有线程:
- 构造方式:new CyclicBarrier(3) 表示等 3 个线程都到达才继续
- 带回调:new CyclicBarrier(3, () -> System.out.println("全部就绪,开始下一轮"))
- 每个线程调用 barrier.await() 进入等待;若超时或中断,抛出 BrokenBarrierException 或 InterruptedException
典型使用场景示例
模拟多线程协同完成多轮任务:比如 4 个工人线程,每轮各自加工一个零件,全部完成后统一质检并清空缓存,再进入下一轮:
- 主线程启动 4 个 worker 线程,每个线程循环执行 doWork() → barrier.await() → doCheck()
- 每次 await() 都会阻塞,直到第 4 个线程到达,才同时唤醒全部线程继续
- 若某线程异常退出或超时,屏障会被打破(broken),后续 await() 直接抛 BrokenBarrierException,需主动调用 reset() 恢复(但注意 reset 不会唤醒已等待线程)
关键注意事项
CyclicBarrier 的行为依赖线程协作,使用中容易踩坑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 不要在屏障动作中做耗时操作——它由最后一个到达的线程执行,会拖慢整体进度
- await() 可能被中断,务必捕获 InterruptedException 并合理处理(如恢复中断状态或退出)
- broken 状态需显式重置:发生异常后 barrier.isBroken() 返回 true,必须调用 reset() 才能再次使用
- 与 CountDownLatch 区别:CyclicBarrier 是“线程间相互等待”,后者是“一个或多个线程等待其他线程完成”,且不可重用
简单可运行示例
以下代码演示 3 个线程分 2 轮执行,每轮打印序号后同步:
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("✅ 本轮完成"));
for (int i = 0; i < 3; i++) {
new Thread(() -> {
for (int round = 1; round <= 2; round++) {
System.out.println("Thread " + Thread.currentThread().getId() + " 完成第 " + round + " 轮");
try { barrier.await(); }
catch (Exception e) { e.printStackTrace(); }
}
}).start();
}
输出中你会看到每轮都有 3 条日志先打印,再出现一次 “✅ 本轮完成”,体现严格同步效果。

















