Java底层类和源码分析系列-AtomicStampedReference解决ABA问题
2021-02-16 00:17
标签:lse field ini swa 原子类 amp str 元素 current 在原子类持续累加或累减时,比如AtomicInteger的incrementAndGet时,是不存在ABA问题的,但compareAndSet或者updateAndGet是可能存在ABA问题,像AtomicBoolean或AtomicLong等这样的变量在多线程修改时,也都存在ABA的问题。 为了解决这个问题,引入了AtomicStampedReference。 解决上个ABA的问题的版本: Java底层类和源码分析系列-AtomicStampedReference解决ABA问题 标签:lse field ini swa 原子类 amp str 元素 current 原文地址:https://www.cnblogs.com/starcrm/p/12711591.html
为了理解ABA,下面的例子,针对线程1来说,第一次的A也就是1和第二次的A是另外修改过的1,实际上并不是同一个A(1)。public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(1);
new Thread(()->{
int value = atomicInteger.get();
System.out.println("thread 1 read value: " + value);
// 阻塞1s
LockSupport.parkNanos(1000000000L);
if (atomicInteger.compareAndSet(value, 3)) {
System.out.println("thread 1 update from " + value + " to 3");
} else {
System.out.println("thread 1 update fail!");
}
}).start();
new Thread(()->{
int value = atomicInteger.get();
System.out.println("thread 2 read value: " + value);
if (atomicInteger.compareAndSet(value, 2)) {
System.out.println("thread 2 update from " + value + " to 2");
// do sth
value = atomicInteger.get();
System.out.println("thread 2 read value: " + value);
if (atomicInteger.compareAndSet(value, 1)) {
System.out.println("thread 2 update from " + value + " to 1");
}
}
}).start();
}
内部类
private static class Pair
属性
private volatile Pair
构造方法
public AtomicStampedReference(V initialRef, int initialStamp) {
pair = Pair.of(initialRef, initialStamp);
}
compareAndSet()方法public boolean compareAndSet(V expectedReference,
V newReference,
int expectedStamp,
int newStamp) {
// 获取当前的(元素值,版本号)对
Pair
private static void testStamp() {
AtomicStampedReference
上一篇:Go语言(十二)web编程
文章标题:Java底层类和源码分析系列-AtomicStampedReference解决ABA问题
文章链接:http://soscw.com/index.php/essay/55842.html