CyclicBarrier的核心是让固定数量线程在屏障点彼此等待、齐步进入下一阶段;“循环”指等待-放行过程可重复,依赖Generation隔离轮次状态,通过ReentrantLock+Condition实现原子性等待与唤醒。

CyclicBarrier 的核心不是“控制循环”,而是让固定数量的线程在某个点上彼此等待,齐步迈入下一阶段;所谓“循环”,是指这一等待-放行过程可重复发生,而非代码层面的 for 或 while 循环。
屏障触发靠最后一个到达者
每个线程调用 await() 时,内部倒计数器 count 减 1。只有当某次减法使 count == 0(即最后一个线程抵达),屏障才真正“触发”:
- 该线程执行构造时传入的 barrierCommand(如有)
- 唤醒所有等待线程
- 重置
count = parties,并创建新 Generation 对象,为下一轮做准备
注意:屏障动作由最后一个到达的线程同步执行,不是另起线程,也不保证执行顺序——它只是“顺带完成”的一步操作。
重用机制依赖 Generation 管理轮次
“可循环”不是简单地把计数器归零,而是通过 Generation 隔离不同轮次的状态:
- 每轮屏障开启或重置,都生成新的
Generation实例 - 所有等待线程被挂起时,绑定的是当前
generation - 若某轮因中断、超时或异常导致失败,该
generation.broken = true,后续 await 会立即抛出BrokenBarrierException - 新轮次使用全新
generation,避免旧轮残留状态干扰
这种设计让 CyclicBarrier 在多轮任务中既安全又轻量,不需要重建对象。
等待与唤醒基于 ReentrantLock + Condition
底层不直接操作 volatile 或 CAS,而是用 ReentrantLock 保证临界区互斥,用其关联的 Condition trip 管理等待队列:
- 非最后一个线程调用 await 后,先加锁,再
trip.await()进入条件等待 - 最后一个线程触发屏障时,持有锁状态下执行 barrierCommand,再调用
trip.signalAll() - 被唤醒的线程需重新竞争锁,获得后才继续执行后续逻辑
这确保了屏障动作和线程释放的原子性,也天然支持超时版本 await(long, TimeUnit)。
典型协同模式:阶段间强同步
CyclicBarrier 适合“所有参与者必须同时跨过某道门”的场景,常见于:
- 分阶段并行计算:如 Jacobi 迭代中,每轮各线程更新局部数据后,必须等全部完成才能读取最新全局状态
- 批量协作任务:如拼团系统中,每满 N 人就统一提交订单并通知仓库,之后继续接纳新用户
- 多线程初始化/清理:多个组件并行加载资源,全部就绪后执行联合校验;或运行结束前统一释放资源
它不适用于“一个主线程等多个子线程完成”的单向等待——那是 CountDownLatch 的定位。

















