Java并发CAS中的ABA问题

1. ABA产生的原因

CAS会导致“ABA问题”。

CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差类会导致数据的变化。

比如说一个线程1从内存位置V中取出A,这时候另一个线程2也从内存中取出A,并且线程2进行了一些操作将值变成了B,然后线程2又将V位置的数据 变成了A,这时候线程1进行CAS操作发现内存中仍然是A,然后线程1操作成功。只关注开始和结尾,不关心中间过程。

尽管线程1的CAS操作成功,但是不代表这个过程就是没有问题的。

2. ABA会带来哪些问题,请举例说明

 

 

3. 解决ABA问题的方案

原子更新字段类AtomicStampedReference可以解决该类问题,每次更新会改变stamp的值,故变量的值发生A->B->A改变时,尽管最后还是值A,但是该变量的stamp发生了改变,避免了变量没有发生改变的假象发生

 

 

4. 参考链接

https://mp.weixin.qq.com/s/sqqK0B2GH2zBNWCoz48m

你可能感兴趣的:(Java,Java,并发编程,CAS,ABA)