cyclicbarrier 的重用由内部 generation 机制自动完成,无需手动 reset();所有线程调用 await() 后屏障触发并自动重置计数器,新 generation 隔离轮次状态,保证安全复用。

CyclicBarrier 的重用不是靠手动 reset(),而是由内部 Generation 机制自动完成的。只要所有参与线程都调用了 await(),屏障触发后立刻恢复初始状态,下一轮可直接使用。
Generation 轮次隔离保证安全复用
每次屏障触发或重置,都会创建一个新 Generation 对象。所有等待线程绑定当前 Generation;若某轮因中断、超时或异常失败,该 Generation 的 broken 标志会被设为 true,后续 await() 就会立即抛出 BrokenBarrierException。新轮次使用全新 Generation,旧状态不会干扰后续执行。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
计数器自动归位,无需干预
- 构造时指定的 parties 值(如 4)是固定基准,内部 count 初始等于 parties
- 每调用一次 await(),count 减 1;当 count == 0(即最后一个线程到达),屏障触发
- 触发后,barrierAction 执行完毕,count 立即重置为 parties,准备迎接下一轮
- 这个过程完全自动,不依赖外部调用 reset()
屏障动作与线程释放原子执行
最后一个到达的线程在持有锁状态下同步执行 barrierAction,再 signalAll 唤醒其余线程。这意味着:
- barrierAction 不另起线程,执行期间其他线程仍在 await() 中阻塞
- 动作完成和线程释放是一体操作,保障阶段切换的原子性
- 若 barrierAction 抛异常,所有线程都会收到 BrokenBarrierException
复用的前提是结构一致
能反复使用的关键在于任务模式稳定:
- 每轮必须有且仅有相同数量的线程参与,不能多也不能少
- 各轮逻辑结构一致,比如“加载→校验→入库”,每个阶段结尾调用一次 await()
- 线程不能在单轮内多次调用 await(),否则计数错乱
- 不能跨轮混用不同线程集合,漏掉任一线程会导致该轮永久阻塞
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










