news 2026/3/23 10:36:16

Java并发利器:AtomicStampedReference解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java并发利器:AtomicStampedReference解析

一、一句话理解

AtomicStampedReference是一个原子引用,它不仅维护一个对象引用,还附带一个整型“戳记(stamp)”,通过同时比较引用和戳记来实现更安全的 CAS(Compare-And-Swap)操作,从而避免经典的 ABA 问题。


二、什么是 ABA 问题?

场景举例:

假设有一个栈,初始状态为A → B → C,栈顶是 A。

  • 线程1 读取栈顶为 A,准备执行 CAS(期望 A,替换为 D)。
  • 此时线程2 弹出 A,再压入新节点 A’(内容相同但地址不同,或甚至同一个 A 被回收后重用)。
  • 栈变成:A → B → C(看起来没变)。
  • 线程1 执行 CAS:发现栈顶仍是 A,于是成功替换为 D。

但实际上,中间发生了变化(A 被弹出又压入),但 CAS 无法感知,这就是ABA 问题

💡 ABA 的本质:值看起来没变,但语义已变


三、AtomicStampedReference如何解决 ABA?

它给每个引用附加一个版本号(stamp)

  • 每次修改引用时,同时更新 stamp(比如 +1)。
  • CAS 操作必须同时匹配引用 + stamp
  • 即使引用值“看起来一样”,只要 stamp 不同,就认为是不同状态。

这样就能区分:

  • “真的是同一个状态” vs
  • “值碰巧相同,但中间被篡改过”

四、核心设计解析

1.内部类Pair<T>

privatestaticclassPair<T>{finalTreference;finalintstamp;// ...}
  • 引用 + stamp打包成一个不可变对象(final字段)。
  • 所有状态变更都通过原子地替换整个Pair对象实现。

✅ 这是一种典型的“不可变快照”设计。


2.volatile 引用

privatevolatilePair<V>pair;
  • 保证多线程对pair的读写具有可见性happens-before语义。
  • 但仅靠volatile无法保证原子性(比如 compare-and-set),所以需要 CAS。

3.关键方法:compareAndSet

publicbooleancompareAndSet(VexpectedReference,VnewReference,intexpectedStamp,intnewStamp){Pair<V>current=pair;returnexpectedReference==current.reference&&// 引用相等(注意:是 ==,不是 equals!)expectedStamp==current.stamp&&((newReference==current.reference&&newStamp==current.stamp)||casPair(current,Pair.of(newReference,newStamp)));}
注意点:
  • 引用比较用==:这是为了性能和语义一致性(通常用于指针/对象身份比较)。
  • 如果新值和当前值完全一样,直接返回true(避免不必要的 CAS)。
  • 否则,调用底层Unsafe.compareAndSwapObject原子替换pair

🔒 底层依赖sun.misc.Unsafe的 CAS 指令(硬件级原子操作)。


4.辅助方法

方法作用
getReference()/getStamp()分别获取当前引用和戳记
get(int[] stampHolder)一次性获取引用和戳记(避免两次读之间状态变化)
set(V, int)无条件设置新值(非原子组合操作,慎用)
attemptStamp(V, int)只更新 stamp,不改变引用(前提是引用仍等于期望值)

📌attemptStamp常用于“标记”场景,比如标记某个节点已被逻辑删除。


5.weakCompareAndSet的说明

publicbooleanweakCompareAndSet(...){returncompareAndSet(...);// 目前 JDK 中两者实现相同}
  • 注释提到它“可能虚假失败,且不提供内存顺序保证”。
  • 但在当前 HotSpot 实现中,它和compareAndSet行为一致。
  • 主要是为了未来在某些平台(如 ARM)上提供更弱但更快的 CAS 变体。

五、典型使用场景

1.无锁数据结构(Lock-Free Data Structures)

  • 如无锁栈、队列、链表等,需要检测 ABA 问题。
  • 示例:在实现ConcurrentLinkedQueue或自定义无锁栈时,用AtomicStampedReference包装头指针。

2.状态机带版本控制

  • 某个对象的状态变更需要记录“版本”,防止旧状态覆盖新状态。

3.资源回收标记

  • 先用attemptStamp将 stamp 设为“已删除”(如 -1),再安全回收。

六、使用示例

AtomicStampedReference<String>ref=newAtomicStampedReference<>("A",0);int[]holder=newint[1];Stringcurrent=ref.get(holder);intcurrentStamp=holder[0];// 尝试将 "A" (stamp=0) 替换为 "B" (stamp=1)booleansuccess=ref.compareAndSet("A","B",0,1);if(success){System.out.println("Update succeeded");}

⚠️ 注意:expectedReference必须是同一个对象引用==成立),不能只是equals相等。


七、与AtomicReference对比

特性AtomicReference<V>AtomicStampedReference<V>
存储内容仅引用引用 + int stamp
解决 ABA❌ 否✅ 是
内存开销稍大(多一个 int + Pair 对象)
使用复杂度简单稍高(需管理 stamp)
性能更快略慢(多一次 int 比较)

八、注意事项

  1. 引用比较是==,不是equals
    → 适用于对象身份比较,不适合值语义(除非你确保同一对象复用)。

  2. stamp 需要手动管理
    → 通常每次修改时stamp + 1,或用时间戳、逻辑版本号。

  3. 不要滥用
    → 如果你的场景不可能出现 ABA(比如引用永远不会被回收重用),用AtomicReference更高效。

  4. Java 9+ 替代方案?
    → 虽然有VarHandle,但AtomicStampedReference仍是解决 ABA 的标准工具。


九、总结

AtomicStampedReference是 Java 并发编程中解决 ABA 问题的经典工具。它通过“引用 + 版本戳”的组合,使得 CAS 操作能够感知到中间状态的变化,从而保证无锁算法的正确性。

它不是日常开发常用类,但在实现高性能、无锁并发数据结构时,它是不可或缺的“利器”。

如果你正在编写 lock-free 或 wait-free 算法,或者遇到因对象复用导致的并发 bug,AtomicStampedReference很可能就是你需要的答案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 10:07:46

基于温度异常的proteus蜂鸣器报警仿真:完整指南

用温度报警玩转Proteus仿真&#xff1a;从传感器到蜂鸣器的完整闭环设计 你有没有遇到过这样的情况&#xff1f;想做个温控系统&#xff0c;但手头没元件、怕烧芯片、调试又麻烦。高温测试不敢做&#xff0c;一通电就担心出问题。 别急—— 在Proteus里&#xff0c;这些问题都…

作者头像 李华
网站建设 2026/3/15 15:50:02

PLC程序启动时配置文件加载机制深度剖析

PLC启动时的配置加载&#xff1a;从机制到实战的深度拆解在工业现场&#xff0c;你是否遇到过这样的场景&#xff1f;一台PLC上电后&#xff0c;指示灯闪烁异常&#xff0c;网络不通&#xff0c;输出无响应。排查半天&#xff0c;最后发现不是硬件故障&#xff0c;也不是程序逻…

作者头像 李华
网站建设 2026/3/14 5:17:41

MAA自动公招系统终极指南:3步实现智能招募解放双手

MAA自动公招系统终极指南&#xff1a;3步实现智能招募解放双手 【免费下载链接】MaaAssistantArknights 一款明日方舟游戏小助手 项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights MAA自动公招系统是专为《明日方舟》玩家设计的智能辅助工具&am…

作者头像 李华
网站建设 2026/3/13 18:20:50

VMware macOS解锁终极指南:3步轻松运行苹果系统

VMware macOS解锁终极指南&#xff1a;3步轻松运行苹果系统 【免费下载链接】unlocker 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 想在普通PC上体验macOS的魅力吗&#xff1f;VMware Unlocker工具正是你需要的解决方案&#xff01;这款神奇的工具能够解…

作者头像 李华
网站建设 2026/3/20 13:18:31

XHS-Downloader:小红书内容高效采集的完整解决方案

在当今内容为王的时代&#xff0c;小红书作为优质内容的聚集地&#xff0c;每天都有海量值得收藏的图文和视频作品。然而&#xff0c;用户在实际操作中常常面临内容保存难、批量处理效率低等痛点。XHS-Downloader作为一款基于AIOHTTP模块构建的开源工具&#xff0c;通过智能化技…

作者头像 李华
网站建设 2026/3/23 11:04:08

VMware解锁macOS实战:从技术原理到完美运行

你是否曾经在VMware中尝试安装macOS&#xff0c;却发现系统选项列表中根本没有苹果的影子&#xff1f;&#x1f914; 这种情况困扰着无数希望在Windows或Linux环境下运行macOS的开发者和技术爱好者。今天&#xff0c;我们将深入探讨这个技术难题的解决方案&#xff0c;让你轻松…

作者头像 李华