news 2026/4/18 3:36:23

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/4/17 6:51:19

终极指南:4步掌握Zotero-SciPDF高效获取学术文献

在学术研究过程中&#xff0c;快速获取文献全文是每个科研工作者的核心需求。Zotero-SciPDF作为专为Zotero 7设计的插件&#xff0c;通过集成学术资源解析器&#xff0c;实现了学术文献的一键下载功能。本指南将带你从零开始&#xff0c;全面掌握这款插件的安装、配置和使用技巧…

作者头像 李华
网站建设 2026/3/14 18:28:48

BGE中文嵌入模型:终极应用指南与实战技巧

BGE中文嵌入模型&#xff1a;终极应用指南与实战技巧 【免费下载链接】bge-large-zh-v1.5 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/bge-large-zh-v1.5 BGE-Large-zh-v1.5是由北京人工智能研究院开发的高性能中文文本嵌入模型&#xff0c;专为中文语义…

作者头像 李华
网站建设 2026/4/16 18:03:35

湖南益为20MW/60MWh储能成功并网,助力打造虚拟电厂示范标杆

2025年12月10日&#xff0c;由联盛新能源集团提供服务并投建的湖南益为配售电公司20MW/60MWh用户侧储能项目正式完成并网调试&#xff0c;标志着项目进入运营阶段。本项目是联盛新能源深化能源转型战略&#xff0c;助力新型电力系统建设和零碳园区发展的又一重要实践。本次并网…

作者头像 李华
网站建设 2026/3/27 10:54:51

Jasminum插件:中文文献管理终极解决方案

还在为管理中文文献而烦恼吗&#xff1f;每次手动输入知网文献信息都让你头疼不已&#xff1f;Jasminum插件正是为你量身打造的中文文献管理神器。这个专为Zotero设计的智能插件&#xff0c;能够一键解决中文文献元数据抓取、PDF导航、附件匹配等核心痛点&#xff0c;让你的学术…

作者头像 李华
网站建设 2026/4/15 16:50:26

小红书数据采集技术指南:XHS-Downloader核心技术解析

引言&#xff1a;数据采集的技术挑战 【免费下载链接】XHS-Downloader 免费&#xff1b;轻量&#xff1b;开源&#xff0c;基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloader 你是否曾在小红书内容采集过…

作者头像 李华
网站建设 2026/4/10 23:37:01

Vue3后台管理系统:构建企业级应用的现代化解决方案

Vue3后台管理系统&#xff1a;构建企业级应用的现代化解决方案 【免费下载链接】vue3-element-admin vue3-element-admin后台管理系统前端解决方案 项目地址: https://gitcode.com/gh_mirrors/vue/vue3-element-admin 在数字化转型浪潮中&#xff0c;企业后台管理系统作…

作者头像 李华