Phaser 的核心是 state 字段的 64 位无锁设计:高 32 位存 phase,低 32 位分 parties 和 unarrived,最高位标记终止;通过 CAS 原子更新实现多阶段屏障,配合自旋+park 等待、onAdvance 钩子及父子树结构降低竞争。

直接看 JDK 源码剖析 Phaser 的多阶段屏障机制,关键不在“堆代码”,而在抓住它的状态压缩设计和 phase 推进逻辑。Phaser 的核心并发控制藏在 state 字段的 64 位原子操作里,不是靠锁,而是靠位运算和 CAS 实现无锁同步。
state 字段:一个 long 装下全部状态
Phaser 内部只用一个 volatile long state 记录所有信息:高 32 位存 phase(当前阶段号),低 32 位拆成两段——高 16 位是 parties(已注册参与者总数),低 16 位是 unarrived(未到达当前 phase 的参与者数)。最高位(第 63 位)标记是否终止。
这种紧凑编码让单次 CAS 就能原子更新多个维度,避免了锁竞争。比如 arrive() 实际执行的是:
- 读取当前
state - 校验 phase 是否有效、是否已终止
- 若未终止且 unarrived > 0,则 CAS 将 unarrived 减 1
- 若 unarrived 减为 0,触发 advance:CAS 将整个
state的 phase + 1,同时重置 parties/unarrived(按新 phase 的注册情况)
arriveAndAwaitAdvance 的等待与唤醒机制
它不挂起线程,而是先调用 arrive() 尝试推进 phase;若自己是最后一个到达者,就触发 advance;否则进入自旋 + 阻塞混合等待。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
等待逻辑在 root.arrive(1) 后调用 doArrive(1),再通过 awaitAdvance(phase) 进入:
– 先检查当前 state 的 phase 是否已变更(非阻塞快速返回)
– 否则进入 UNSAFE.park() 挂起,直到被其他线程在 advance 时通过 UNSAFE.unpark() 唤醒
– 唤醒后再次检查 phase,确保没被跳过(防止虚假唤醒)
onAdvance 的钩子与动态注册协同
onAdvance(int phase, int registeredParties) 是 protected 方法,默认返回 registeredParties == 0(即无人注册则终止)。重写它可实现阶段间逻辑:
- phase 为 0 时做初始化(如加载配置)
- phase 为 1 时启动计算任务
- phase 为 2 时汇总结果并注销部分线程(调用
arriveAndDeregister())
注意:onAdvance 在 advance 过程中被同步调用,此时所有线程都尚未从 await 中返回,因此可在其中安全修改后续阶段的参与者结构。
父子 Phaser 树:降低竞争的分层设计
当参与者数量大或争抢激烈时,Phaser 支持构造树形结构:
– 子 Phaser 注册到父 Phaser,作为父的一个“party”
– 子 Phaser 自己管理一组线程,内部完成 advance 后才向父报告到达
– 父仅需等所有子到达,大幅减少根节点的 CAS 冲突
源码中通过 parent 引用和 hierarchical 标志位控制该行为,arriveAndAwaitAdvance() 会自动向上递归传播到达信号。

















