结论:类构造器本身不具原子性,无锁状态机依赖atomicreference+不可变状态+cas跃迁组合。构造器仅负责初始化,安全发布需通过compareandset等原子引用操作实现,配合final字段与无副作用设计,确保线程安全的状态流转。

直接说结论:类构造器方法本身不具有原子性,不能直接用于构建无锁状态机;真正起作用的是对象创建 + 原子引用发布(如 AtomicReference 的 compareAndSet)这一组合,配合不可变状态设计。
所谓“构造器的原子性”是个常见误解——Java 中 new SomeClass() 这一操作在语义上是原子的(即不会出现“半初始化对象被其他线程看到”的情况),但前提是该对象正确发布(safely published)。若构造后通过普通变量赋值(如 state = new StateA()),仍可能因指令重排序或缓存不可见,导致其他线程看到未完全初始化的对象(尤其在未加 final 字段或未用同步机制时)。因此,无锁状态机的核心不是构造器,而是原子引用 + 不可变状态 + CAS驱动的状态跃迁。
为什么不能依赖构造器“自动原子”
- 构造器只负责初始化本对象字段,不控制其引用如何被其他线程观察;
- 若状态引用是普通变量(如
State currentState;),多线程写入/读取会遭遇可见性问题; - 即使构造过程安全,发布过程不安全 → 整体仍非线程安全。
✅ 正确做法:用 AtomicReference<state></state> 封装状态,并确保 State 类是不可变的(immutable)(所有字段 final,无 setter,无内部可变状态)。
设计无锁高性能状态机的三个关键步骤
-
定义不可变状态类
每个状态是一个 final 字段、无副作用的 POJO 或 record:record StateA(int code, String reason) implements State {} record StateB(long timestamp) implements State {} -
使用
AtomicReference<state></state>管理当前状态
所有状态变更都通过compareAndSet(expected, next)实现乐观更新:private final AtomicReference<state> stateRef = new AtomicReference(new StateA(0, "init")); boolean tryTransitionToB() { State current = stateRef.get(); if (current instanceof StateA) { StateB nextState = new StateB(System.nanoTime()); return stateRef.compareAndSet(current, nextState); // 成功返回 true,失败返回 false } return false; }</state> -
按业务语义封装状态跃迁逻辑(带条件与副作用隔离)
- 将判断逻辑(如“仅当当前是 A 且 code == 0 时才能转 B”)放在 CAS 前;
- 真正的副作用(如日志、回调、资源申请)放在 CAS 成功之后,避免重复执行:
void handleEventX() { while (true) { State s = stateRef.get(); if (s instanceof StateA a && a.code() == 0) { StateB next = new StateB(System.nanoTime()); if (stateRef.compareAndSet(s, next)) { onStateBEntered(next); // ✅ 只执行一次 break; } } else { break; // 不符合跃迁条件,退出 } } }
高并发下的性能优化要点
- 避免在循环中做耗时操作:CAS 失败时应快速重试,不要 sleep 或阻塞;
-
减少状态对象分配:对高频状态(如
StateRunning/StateIdle),可用单例对象(static final)复用,降低 GC 压力; -
必要时引入版本号防 ABA:若状态可能被反复设为相同类型(如 A→B→A),且业务逻辑敏感,改用
AtomicStampedReference; -
内存序选
relaxed或acquire/release即可:状态机本身不依赖全局顺序,通常compareAndSet默认的seq_cst过重,可显式指定更轻量的序(如stateRef.weakCompareAndSetPlain+ 后续getAcquire)。
和传统锁状态机对比优势
- ✅ 无上下文切换、无阻塞、无死锁风险;
- ✅ 在中低竞争下延迟极低(纳秒级 CAS);
- ✅ 可自然支持“尝试性跃迁”语义(如
tryEnterCritical()返回布尔值); - ❌ 缺点是编码复杂度略高,需严格保证状态不可变和跃迁逻辑幂等。
本质上,这不是“用构造器实现无锁”,而是把状态机建模为原子引用上的不可变值流,用 CAS 实现状态跃迁的线性化点——这才是工业级无锁状态机的落地核心。










