CAS 机制在 ABA 问题中怎么使用 AtomicStampedReference

风芳吖_4931

风芳吖_4931

2026-08-10

974人浏览

原创

atomicstampedreference 通过“引用+版本号”双校验使 aba 可识别拦截,必须原子获取快照(用 get(int[])/compareandset),避免分离调用导致数据不一致,适用于对象池、链表指针等引用复用场景。

cas 机制在 aba 问题中怎么使用 atomicstampedreference

AtomicStampedReference 不是让 ABA 消失,而是让 ABA 可被识别和拦截。它通过“引用 + 版本号”双校验机制,在 CAS 执行前就暴露中间修改,从而避免因值表面未变而误判状态一致。

必须一次性读取引用和版本号
不能分开调用 getReference() 和 getStamp(),因为二者非原子:中间可能被其他线程修改,导致拿到的 reference 和 stamp 不属于同一快照。正确做法是声明 int[] stampHolder = new int[1],再调用 ref.get(stampHolder) —— 这个方法会原子地把当前引用和当前版本号一起返回,stamp 值写入数组首元素。

每次 compareAndSet 都要基于最新快照计算新版本号
例如:

int[] stamp = new int[1];
String cur = ref.get(stamp);
int oldStamp = stamp[0];
boolean success = ref.compareAndSet("INIT", "PROCESSED", oldStamp, oldStamp + 1);

若失败,不能沿用旧 oldStamp 继续尝试;必须重新 get(stamp) 获取最新 pair,再算 newStamp。硬编码 0 → 1 → 2 或缓存 oldStamp 是常见错误,会导致 CAS 永远不成功。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载

compareAndSet 失败不等于业务失败,而是状态已不可信
比如两个线程竞争将状态从 "INIT" 更新为 "PROCESSED":

  • 线程 A 读到 "INIT" 和 stamp=0,准备 CAS;
  • 线程 B 先改为 "TEMP"(stamp=1),再改回 "INIT"(stamp=2);
  • 线程 A 用 expectedStamp=0 执行 CAS,因当前 stamp 已是 2,直接失败。
    这恰恰是设计目标:阻止 A 在过期快照上操作,避免逻辑错乱(如重复扣款、悬空节点出栈)。

适用边界要清楚
它解决的是“引用被复用”类 ABA,比如对象池节点、链表指针、缓存 key 回收再分配等场景。如果业务中 "A→B→A" 是合法且无副作用的状态切换(如开关反复 toggling),加版本号反而徒增开销和复杂度。

不复杂但容易忽略。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

2023.11.02

7079

18

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

80

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

40

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

20

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

20

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

40

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

40

19

loomy官网入口地址合集
loomy官网入口地址合集

本专题汇总了 Loomy 桌面 AI 助理的官方入口地址合集及使用指南。提供 macOS 与 Windows 客户端下载 。Loomy 是讯飞推出的桌面级 AI 工作搭子,支持文件整理、数据分析、网页操作及通过飞书/钉钉远程操控电脑,助你高效完成本地办公任务 。

2026.09.22

40

19

NumPy常见函数使用方法
NumPy常见函数使用方法

本专题整理 NumPy 常见函数使用方法相关教程,覆盖函数大全、参数用法、数组运算、统计聚合、排序处理、where 条件筛选、linspace 创建数列等常用场景,帮助读者快速掌握 NumPy 函数调用思路和实际数据处理技巧。

2026.09.22

60

21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习