CyclicBarrier 的核心价值在于支持多轮协同且自动重置,前提是所有线程均正常到达;若任一异常则进入破损状态,需调用 reset() 恢复。

CyclicBarrier 的核心价值在于它天然支持多轮协同——不是用完即弃,而是自动重置、反复生效。只要所有线程都成功到达一次屏障点,内部计数器就会归零并恢复初始状态,后续线程可直接调用 await() 进入下一轮等待,无需重建实例。
屏障重用的前提条件
重用不是无条件的。只有当所有参与线程都正常调用 await() 并成功通过(未被中断、未超时、未抛出异常),屏障才会干净地重置。一旦任一线程在等待过程中被中断、超时或抛出未捕获异常,屏障会进入“破损”(broken)状态,后续所有 await() 调用都会立即抛出 BrokenBarrierException,此时必须手动调用 reset() 才能恢复可用。
典型多阶段协同流程
一个常见的三阶段任务(如数据加载 → 校验 → 汇总)可这样组织:
- 初始化
CyclicBarrier barrier = new CyclicBarrier(4),表示每阶段需 4 个线程协同 - 每个线程执行第一阶段任务后调用
barrier.await(),全部就绪后才进入第二阶段 - 第二阶段任务完成后再次调用
barrier.await(),触发第三阶段启动 - 整个过程共用同一个 barrier 实例,不创建新对象,避免 GC 压力
带回调的循环同步
若需在每轮屏障释放前执行统一动作(如日志记录、资源检查、状态广播),可在构造时传入 Runnable:
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("✅ 阶段完成,准备下一阶段"));
该回调由最后一个到达的线程执行,且仅在本轮所有线程都成功抵达时触发。它不阻塞其他线程,执行完毕后所有线程才被同时唤醒。
手动重置与异常恢复
当发生异常导致屏障破损时,可通过 barrier.reset() 强制恢复初始状态。注意:
– reset 会唤醒所有正在等待的线程,并使它们收到 BrokenBarrierException
– 已通过的线程不受影响,但后续调用需确保所有线程重新对齐起始点
– 生产环境建议配合 try-catch 和重试逻辑使用,避免单点失败阻断整条流水线

















