您的位置:首页 > 其它

CAS ABA问题

2012-09-13 00:00 232 查看
首先要知道什么叫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问题 阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: