ABA问题是CAS机制中出现的一个问题,他的描述是这样的。我们直接画一张图来演示,
什么意思呢?就是说一个线程把数据A变为了B,然后又重新变成了A。此时另外一个线程读取的时候,发现A没有变化,就误以为是原来的那个A。这就是有名的ABA问题。ABA问题会带来什么后果呢?我们举个例子。
一个小偷,把别人家的钱偷了之后又还了回来,还是原来的钱吗,ABA问题也一样,如果不好好解决就会带来大量的问题。最常见的就是资金问题,也就是别人如果挪用了你的钱,在你发现之前又还了回来。但是别人却已经触犯了法律。
如何去解决这个ABA问题呢,就是使用今天所说的AtomicStampedReference。
二、AtomicStampedReference
1、问题解决
我们先给出一个ABA的例子,对ABA问题进行场景重现。
public class AtomicTest {
private static AtomicInteger index = new AtomicInteger(10);
public static void main(String[] args) {
new Thread(() -> {
index.compareAndSet(10, 11);
index.compareAndSet(11, 10);
System.out.println(Thread.currentThread().getName()+
":10->11->10");
},"张三").start();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(2);
boolean isSuccess = index.compareAndSet(10, 12);
System.out.println(Thread.currentThread().getName()+
":index是预期的10嘛,"+isSuccess
+" 设置的新值是:"+index.get());
} catch (InterruptedException e) {
e.printStackTrace();
}
},"李四").start();
}
}
在上面的代码中,我们使用张三线程,对index10->11->10的变化,然后李四线程读取index观察是否有变化,并设置新值。运行一下看看结果: