网站首页 > 文章精选 正文
AtomicStampedReference和AtomicMarkableReference
ABA问题与解决办法
到目前为止,CAS都是基于“值”来做比较的。但如果另外一个线程把变量的值从A改为B,再从B改回到A,那么尽管修改过两次,可是在当前线程做CAS操作的时候,却会因为值没变而认为数据没有被其他线程修改过,这就是所谓的ABA问题。
要解决 ABA 问题,不仅要比较“值”,还要比较“版本号”,而这正是 AtomicStamped-Reference做的事情,其对应的CAS函数如下:
之前的 CAS只有两个参数,这里的 CAS有四个参数,后两个参数就是版本号的旧值和新值。
当expectedReference!=对象当前的reference时,说明该数据肯定被其他线程修改过;
当expectedReference==对象当前的reference时,再进一步比较expectedStamp是否等于对象当前的版本号,以此判断数据是否被其他线程修改过。
为什么没有AtomicStampedInteger或AtomictStampedLong
要解决Integer或者Long型变量的ABA问题,为什么只有AtomicStampedReference,而没有AtomicStampedInteger或者AtomictStampedLong呢?
因为这里要同时比较数据的“值”和“版本号”,而Integer型或者Long型的CAS没有办法同时比较两个变量,于是只能把值和版本号封装成一个对象,也就是这里面的 Pair 内部类,然后通过对象引用的CAS来实现。代码如下所示。
当使用的时候,在构造函数里面传入值和版本号两个参数,应用程序对版本号进行累加操作,然后调用上面的CAS。如下所示。
AtomicMarkableReference
AtomicMarkableReference与AtomicStampedReference原理类似,只是Pair里面的版本号是boolean类型的,而不是整型的累加变量,如下所示。
因为是boolean类型,只能有true、false 两个版本号,所以并不能完全避免ABA问题,只是降低了ABA发生的概率。
本篇给大家讲解的内容是JDK源码剖析之Atomic类——AtomicStampedReference和AtomicMarkableReference
下篇文章给大家介绍的内容是JDK源码剖析之Atomic类——AtomicIntegerFieldUpdater、
AtomicLongFieldUpdater和
AtomicReferenceFieldUpdater
猜你喜欢
- 2025-05-10 【锁思想】自旋 or CAS 它俩真的一样吗?一文搞懂
- 2025-05-10 盘点JAVA中基于CAS实现的原子类(盘点java中基于cas实现的原子类是什么)
- 2025-05-10 Java并发 之 Atomic 原子操作类(java如何实现原子性)
- 2025-05-10 java并发-AtomicStampedReference
- 2025-05-10 Java并发工具:AtomicStampedReference
- 05-10【锁思想】自旋 or CAS 它俩真的一样吗?一文搞懂
- 05-10盘点JAVA中基于CAS实现的原子类(盘点java中基于cas实现的原子类是什么)
- 05-10Java并发 之 Atomic 原子操作类(java如何实现原子性)
- 05-10JDK源码剖析之AtomicStampedReference和AtomicMarkableReference
- 05-10java并发-AtomicStampedReference
- 05-10Java并发工具:AtomicStampedReference
- 05-1011款常用Java编程软件推荐(建议收藏)
- 05-10优秀程序员必用工具锦集(一款程序员必备的软件)
- 最近发表
-
- 【锁思想】自旋 or CAS 它俩真的一样吗?一文搞懂
- 盘点JAVA中基于CAS实现的原子类(盘点java中基于cas实现的原子类是什么)
- Java并发 之 Atomic 原子操作类(java如何实现原子性)
- JDK源码剖析之AtomicStampedReference和AtomicMarkableReference
- java并发-AtomicStampedReference
- Java并发工具:AtomicStampedReference
- 11款常用Java编程软件推荐(建议收藏)
- 优秀程序员必用工具锦集(一款程序员必备的软件)
- 《若依ruoyi》第一章:本地开发环境搭建
- 软件开发不可错过的6款必备工具(软件 开发工具)
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)