网站首页 > 文章精选 正文
AtomicStampedReference
AtomicStampedReference 是 Java 中 java.util.concurrent.atomic 包下提供的一个类,用于解决 ABA 问题。ABA 问题是指在并发环境下,某个变量从 A 变为 B 再变回 A,尽管最终值看起来没有变化,但中间发生了改变,这对依赖于比较并交换机制(CAS)的无锁算法可能造成困扰。
基本概念
- 版本戳:AtomicStampedReference 通过引入一个整型的“版本号”或称为“戳”,来跟踪对象引用的变化。每次更新引用时,也会更新这个版本号,这样即使引用的值回到了原来的状态,版本号也会不同,从而避免了 ABA 问题。
- 构造函数:
- AtomicStampedReference(V initialRef, int initialStamp):创建一个新的 AtomicStampedReference,带有给定的初始值和戳。
- 主要方法:
- V getReference():获取当前引用。
- int getStamp():获取当前戳。
- V get([int[] stampHolder]):除了返回当前引用外,还可以通过 stampHolder 数组的第一个元素获取当前戳。
- boolean weakCompareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp):原子地设置引用和戳,如果当前引用等于预期引用且当前戳等于预期戳,则更新为新引用和新戳。这是一个弱的 CAS 操作,可能会失败而不保证立即重试。
- boolean compareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp):类似于 weakCompareAndSet,但是提供强保证,即如果条件满足,则操作必定成功。
- void set(V newReference, int newStamp):直接设置新的引用和戳,不进行任何检查。
示例代码
使用 AtomicStampedReference 来解决 ABA 问题:
import java.util.concurrent.atomic.AtomicStampedReference;
public class ABADemo {
public static void main(String[] args) throws InterruptedException {
AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(100, 0);
Thread t1 = new Thread(() -> {
int[] stampHolder = new int[1];
atomicStampedReference.get(stampHolder);
System.out.println("Initial Value: " + atomicStampedReference.getReference() + ", Stamp: " + stampHolder[0]);
boolean success = atomicStampedReference.compareAndSet(100, 101, stampHolder[0], stampHolder[0] + 1);
System.out.println("First Update Success: " + success + ", New Value: " + atomicStampedReference.getReference() + ", Stamp: " + atomicStampedReference.getStamp());
success = atomicStampedReference.compareAndSet(101, 100, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1);
System.out.println("Second Update Success: " + success + ", New Value: " + atomicStampedReference.getReference() + ", Stamp: " + atomicStampedReference.getStamp());
});
Thread t2 = new Thread(() -> {
int[] stampHolder = new int[1];
atomicStampedReference.get(stampHolder);
try {
Thread.sleep(100); // 确保t1先执行
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean success = atomicStampedReference.compareAndSet(100, 1042, stampHolder[0], stampHolder[0] + 1);
System.out.println("Update by t2 Success: " + success + ", New Value: " + atomicStampedReference.getReference() + ", Stamp: " + atomicStampedReference.getStamp());
});
t1.start();
t2.start();
t1.join();
t2.join();
}
}
在这个示例中,线程 t1 首先将值从 100 更改为 101 并增加戳,然后又改回 100 并再次增加戳。与此同时,线程 t2 尝试将值从 100 改为 1042。由于 AtomicStampedReference 跟踪了版本戳,所以 t2 的尝试会失败,因为它持有的是旧的戳值。这有效地防止了 ABA 问题的发生。
猜你喜欢
- 2025-05-10 【锁思想】自旋 or CAS 它俩真的一样吗?一文搞懂
- 2025-05-10 盘点JAVA中基于CAS实现的原子类(盘点java中基于cas实现的原子类是什么)
- 2025-05-10 Java并发 之 Atomic 原子操作类(java如何实现原子性)
- 2025-05-10 JDK源码剖析之AtomicStampedReference和AtomicMarkableReference
- 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)