barrieraction 在最后一个线程调用 await() 且计数归零时由该线程同步执行,需满足全员到达、计数为零、屏障未损坏三条件;执行完才唤醒其他线程,异常会传播并使屏障失效。

BarrierAction 在最后一个线程调用 await() 且计数归零时触发,不是提前、不是延后,也不是由独立线程执行——它严格绑定于“凑齐人数”那一刻。
触发必须满足三个硬性条件
缺一不可,否则 BarrierAction 完全不会执行:
- 所有 parties 个线程都成功调用了
await()(无中断、无超时、无异常退出) - 内部计数器 count 减至 0,确认全员到齐
- 屏障当前处于 未损坏(not broken) 状态,即没有线程因中断或超时导致屏障提前失效
谁来执行?在什么上下文中运行?
它由第 parties 个到达的线程同步执行,直接运行在该线程的栈中:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 继承该线程的
ClassLoader、ThreadLocal和安全上下文 - 不启用新线程,也不走线程池;如需异步操作(比如发通知),必须显式提交任务
- 若执行耗时过长,其余所有等待线程将持续阻塞,可能引发超时或级联失败
执行时机:紧接计数归零,早于唤醒其他线程
顺序非常关键:
- 最后一个线程完成
count--,发现结果为 0 - 立即调用
barrierCommand.run() - 等 barrierAction 完全返回后,才调用
signalAll()唤醒其余线程 - 接着创建新
Generation,重置计数器,准备下一轮
异常会中断整个流程
BarrierAction 内抛出未捕获异常(如 RuntimeException)时:
- 会被包装为
BrokenBarrierException - 该异常将传播给所有正在 await() 的线程(包括执行它的那个线程)
- 屏障进入 broken 状态,后续 await() 直接抛出异常,不再等待
- 下一轮必须调用
reset()或新建实例才能恢复
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










