cyclicbarrier的核心价值在于支持线程组“齐步走”与自动复用,通过generation代次机制实现安全循环,依赖全员调用await()触发屏障,最后到达线程执行barrieraction,底层基于reentrantlock+condition保证同步安全。

CyclicBarrier 的核心价值在于它既能强制一组线程“齐步走”,又能自动复用——不是用完即废,而是每轮同步完成后立即进入下一轮准备。这种设计直击分阶段协作场景的痛点,比如批量数据处理、多节点协同计算、模拟拼团成团等需要反复对齐执行节奏的业务。
屏障触发依赖“全员到齐”,而非外部指令
与 CountDownLatch 不同,CyclicBarrier 的触发完全由参与线程自身驱动:每个线程调用 await() 即表示“我到了”,内部计数器减一;当计数器归零(即最后一名线程到达),屏障才被释放。这个过程无需第三方线程调用 countDown 或其他操作,天然适合对等协作模型。
- 最后一个到达的线程负责执行可选的 barrierAction(如汇总结果、发通知、校验状态)
- 所有线程在 await() 返回后才继续向下执行,确保动作严格同步
- 若某线程因中断或超时退出,屏障即被破坏,其余等待线程会收到 BrokenBarrierException
循环执行靠 Generation 代次隔离,避免旧唤醒干扰新轮次
“可循环”不是简单重置计数器,而是通过 Generation(代次)机制实现安全复用。每次屏障被触发后,内部 generation 对象更新,所有线程被唤醒并进入新代次;此前阻塞在旧代次上的等待逻辑自动失效,杜绝了跨轮次误唤醒问题。
- reset() 方法会强制进入新代次,并让当前等待线程抛出 BrokenBarrierException
- isBroken() 可检测当前屏障是否因异常而处于不可用状态
- getNumberWaiting() 返回的是当前代次中尚未到达的线程数,反映实时等待态
底层基于 ReentrantLock + Condition 实现阻塞与唤醒
其同步控制不依赖 volatile 或 CAS 轮询,而是使用可重入锁配合条件队列:线程 await 时加锁、检查计数、未满则 await() 在 condition 上挂起;计数归零后,调用 signalAll() 唤醒全部等待线程,再解锁并重置状态。
- 这种设计保证了唤醒的原子性与顺序安全性
- 超时版本 await(long, TimeUnit) 在 condition.awaitNanos() 中实现,支持精确等待控制
- 异常路径中会主动标记 barrier 为 broken,防止状态污染
适用边界:固定规模、阶段性对齐、需复用的协作场景
它不适合动态增减参与者数量的场景(parties 在构造时固定),也不适合仅需单次等待的简单同步(此时 CountDownLatch 更轻量)。典型用例包括:
- 多线程分块计算后统一合并结果(如矩阵乘法分片)
- 分布式事务中的本地预提交协调
- 游戏服务器中玩家组队副本的入场同步
- 电商拼团中“满员即开团”的多次循环判定











