CyclicBarrier 的核心价值在于“多线程齐步走”,支持固定数量线程反复同步等待、集体出发,适用于分阶段并行、需统一协调启动或汇总结果的场景,如 Jacobi 迭代、电商预热、拼团等,并提供 barrierAction、超时控制和 reset 等机制。

CyclicBarrier 的核心价值在于“多线程齐步走”——它让固定数量的线程彼此等待,直到全部抵达同一同步点,再集体出发;且这个过程可重复,无需重建对象。
适合分阶段并行处理的场景
当任务天然划分为多个轮次、每轮又包含若干并行子任务时,CyclicBarrier 是理想选择。比如数值计算中的 Jacobi 迭代:每轮所有线程各自更新一部分网格值,必须等全部更新完成,才能用新值开始下一轮计算。
- 每轮迭代中,各线程独立计算,互不依赖中间结果
- 所有线程调用 await() 阻塞在屏障点,不提前进入下一轮
- 最后一人到达时自动触发屏障动作(如校验收敛性),再统一放行
需要统一协调启动或汇总的协作任务
多个线程需在“准备就绪”后同步开始执行,或在各自完成局部工作后集中交付结果。典型如电商大促前的数据预热:商品校验、库存刷新、价格同步三个子任务由不同线程执行,必须全部完成才触发缓存加载。
- 使用带 Runnable barrierAction 的构造器,在全员到达后执行汇总逻辑(如合并统计、发通知)
- barrierAction 在最后一个到达线程的上下文中运行,避免额外线程竞争共享资源
- 若某线程异常退出,其他等待线程会收到 BrokenBarrierException,便于快速失败定位
模拟协同行为或周期性同步点
适用于业务逻辑中存在明确“集合点”的模型,例如拼团、游戏准备、分布式节点心跳对齐等。像拼团场景中,每凑够 N 人就生成一个订单并通知仓库,之后继续等待下一组。
立即学习“Java免费学习笔记(深入)”;
- 每次 await() 返回值是线程在本轮的到达序号(从 parties−1 递减到 0),可用于区分“最后一名”做特殊处理
- 支持超时控制(await(long, TimeUnit)),防止个别线程卡死导致整组阻塞
- 调用 reset() 可主动重置屏障,但会令正在等待的线程抛出 BrokenBarrierException,慎用于运行中调整
与 CountDownLatch 的关键区别提醒
CyclicBarrier 是“参与者彼此等待”,CountDownLatch 是“等待者等待触发者”。前者强调协作与循环复用,后者侧重一次性事件通知。
- 线程数固定且不变 → 优先选 CyclicBarrier
- 需要多次重复同步 → CyclicBarrier 天然支持,CountDownLatch 需重建实例
- 屏障点需执行协调逻辑(如结果合并)→ CyclicBarrier 的 barrierAction 更直接安全


















