phaser通过阶段推进原子性、参与者状态严格跟踪和等待/到达语义约束实现无锁强一致性;phase由volatile int+ cas维护,保证顺序一致性和到达有效性;参与者生命周期与计数绑定,杜绝幽灵参与者;到达与等待分离消除竞态;onadvance回调在临界区串行执行,数据可信且可终止phaser。

阶段编号(phase)是全局单调递增的协调锚点
Phaser 内部用一个 volatile int 维护当前 phase,每次推进都通过 CAS 原子更新。它不保证绝对不溢出,但确保:
— 所有线程看到的 phase 变化是顺序一致的(happens-before 关系成立)
— 任意线程调用 arriveAndAwaitAdvance() 时,要么成功参与本轮推进,要么因已终止/未注册而失败
— getPhase() 返回值虽可能被后续操作覆盖,但它反映的是“已确认完成”的阶段,不是预测值
参与者计数与生命周期绑定,杜绝“幽灵参与者”
每个线程是否计入当前阶段,由其是否完成 register() → arrive*() → (可选 deregister) 这一链路决定:
— register() 不仅增加计数,还标记该线程对“下一 phase”生效,不会干扰当前阶段节奏
— arriveAndDeregister() 是原子操作:既完成到达登记,又从后续阶段彻底移除,避免残留计数导致 phase 卡死
— 未显式注销的线程,其退出后 Phaser 自动清理,不依赖 finalize 或弱引用,无内存泄漏风险
到达(arrive)与等待(await)分离,消除竞态窗口
Phaser 把“我到了”和“我等别人”拆成两个明确动作,中间没有状态空档:
— arriveAndAwaitAdvance() 是单次调用、不可分割:先登记自己,再阻塞,直到 phase 推进完成才返回新 phase 值
— awaitAdvance(int phase) 要求调用者**必须已到达当前 phase**(否则直接返回 false),防止“空等”或误判
— 主线程协调时常用模式:记下起始 phase → 启动任务 → awaitAdvance(起始 phase),确保只等这一轮,不被后续自动推进干扰
onAdvance 回调运行在 phase 提交临界区,天然串行
重写的 onAdvance(int phase, int registeredParties) 方法,在所有线程完成到达、CAS 更新 phase 成功后、唤醒前执行:
— 它运行在内部锁保护的临界区内,同一时刻最多一个线程执行该回调
— 参数 phase 是刚结束的阶段号,registeredParties 是下一阶段实际有效参与者数,数据绝对可信
— 返回 true 会立即终止 Phaser,后续所有 arrive 操作返回负值,状态切换无歧义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











