CyclicBarrier 的核心价值在于精准控制多线程集体同步——所有线程必须在指定点齐步暂停、全员就位后才统一放行,适用于分片计算、批量校验等阶段性协同场景。

CyclicBarrier 的核心价值在于它能精准控制多线程的“集体步调”——不是谁先完成谁先走,而是所有线程必须在指定点齐步暂停,等全员就位后才统一放行。这种设计天然适合需要阶段性协同的场景,比如分片计算、批量校验、协同初始化等。
明确参与线程数与屏障动作
构造 CyclicBarrier 时,parties 参数必须严格匹配实际参与同步的线程数量。少设会导致永远等不满,多设则提前触发(但剩余线程 await 会立即返回,容易引发逻辑错乱)。若需在全员到达后执行统一操作(如汇总结果、刷新状态、打印日志),应使用带 Runnable 的构造方法:
- 该 Runnable 由最后一个调用 await() 的线程执行,不另起线程
- 动作内避免耗时或阻塞操作,否则会拖慢所有线程的后续执行
- 若动作抛出异常,屏障将被标记为 broken,后续 await 调用直接抛 BrokenBarrierException
合理使用 await() 与超时机制
每个参与线程在关键同步点调用 await(),这是阻塞等待的入口。生产环境强烈建议使用带超时的版本:
-
await(long timeout, TimeUnit unit)可防止因某个线程异常挂起导致整个屏障永久阻塞 - 超时后抛出 TimeoutException,调用方需捕获并做降级或重试处理
- 未超时成功通过时,await() 返回当前线程在本代中的到达序号(从 0 开始),可用于主从角色判断
利用可重用性实现多阶段协作
CyclicBarrier 的“循环”特性不是自动循环,而是在所有线程通过后自动重置计数器,准备迎接下一轮等待。这意味着同一实例可被反复用于多个同步周期:
- 无需每次 new 实例,节省对象开销,也利于状态复用(如共享 barrierAction)
- 适用于固定线程池中长期运行的任务,例如每轮处理一批数据 → 汇总 → 清理 → 下一轮
- 若中途需强制重置(如某轮失败需重来),可调用 reset() 方法,但要注意:正在 await 的线程会收到 BrokenBarrierException
注意异常与中断响应
CyclicBarrier 对异常处理有明确语义:
- InterruptedException:线程在 await 期间被中断,屏障状态不变,但当前线程抛异常退出
- BrokenBarrierException:屏障已被破坏(如 reset() 被调用、barrierAction 抛异常、其他线程中断),所有等待线程都会收到此异常
- 一旦发生 BrokenBarrierException,该 CyclicBarrier 实例即不可再用,需重建或显式 reset(reset 后仍需检查是否 broken)

















