cyclicbarrier的核心作用是让一组线程在栅栏点互相等待,直至全部到达才同步放行;它支持可选回调、自动重置复用,适用于多轮分阶段并行协作场景。

CyclicBarrier 的核心作用是让一组线程在某个“栅栏点”互相等待,直到全部到达后才一起继续执行——它不负责任务分发或结果汇总,而是专注协调多线程的同步节奏。
栅栏点:所有线程必须抵达才能放行
每个 CyclicBarrier 初始化时指定参与线程数(例如 new CyclicBarrier(4)),任意线程调用 await() 即进入等待状态;只有当第 4 个线程也调用 await(),所有 4 个线程才同时被唤醒、继续向下执行。任一线程提前退出(如抛异常)会导致其他线程收到 BrokenBarrierException,栅栏即失效。
- 支持可选的 Runnable 回调:最后一个到达的线程会在放行前执行该任务(常用于汇总、日志或资源准备)
- 可重复使用:与 CountDownLatch 不同,CyclicBarrier 在一次触发后自动重置,适合多轮协作场景(如多轮模拟计算)
典型协作模式:分阶段并行 + 统一推进
适用于“每轮各线程独立干活 → 全部完成再统一进入下一轮”的流程。比如模拟多人协同训练模型:
- 线程 A 计算第 1 批数据梯度
- 线程 B 更新第 1 批参数
- 线程 C 验证第 1 批效果
- 线程 D 日志记录第 1 批结果
- 4 个线程各自 await() 后,才开始第 2 批处理
注意线程安全与异常处理
await() 是阻塞方法,需考虑超时和中断:
- 用 await(long timeout, TimeUnit unit) 避免永久挂起
- 捕获 InterruptedException 和 BrokenBarrierException,前者表示线程被中断,后者表示栅栏已被破坏(如某线程异常退出)
- 一旦发生 BrokenBarrierException,需主动调用 reset() 恢复栅栏(否则后续 await() 仍抛异常)
和 CountDownLatch 的关键区别
CountDownLatch 是“单次倒计时门闩”,适合“一个线程等多个线程完成”;CyclicBarrier 是“循环式会合点”,适合“多个线程彼此等待、共同推进”。两者目的不同,不可简单替换。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











