CAS ABA问题

首先要知道什么叫CAS(compare and swap):在jdk里面可以由UnSafe提供一个针对于volatile变量的操作,其原理是直接调用的CPU的CAS动作
举个例子:
我们经常会有这样的操作
if(a==b)
a = b+1;
在多线程的环境下,如果在执行完a==b之后,a发生了改变,我们就达不到预期的结果了

所以,就有了cas操作
具体你可以看看JDK的AtomicInteger,就提供了这样的cas操作compareAndSet

有了CAS,对于程序而言还不够
因为compareAndSet只是做一个尝试,如果失败了怎么办?我们还是想要做到a=b+1的结果
所以有了这样的代码
while(true)
{
if(a.compareAndSet(expect,update))
……
else
continue;
}
通过这样的方法,我们就得到了a=b+1的效果(在没上锁的情况下)

再下一步,进入你的问题了,ABA问题在这种编码下就出现了
假如你的一次else之后,再次a.compareAndSet(expect,update)之前
a改变了两次,第一次改为其他值,第二次改回来了

这样称之为ABA问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值