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问题 阅读更多
举个例子:
我们经常会有这样的操作
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问题 阅读更多
相关文章推荐
- 无锁编程:lock-free原理;CAS;ABA问题
- Java CAS 和ABA问题
- CAS中的ABA问题
- Java并发学习(十)-CAS中ABA问题解决方法
- CAS 机制 & ABA 问题的理解
- 聊聊高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference源码来看如何解决CAS的ABA问题
- CAS操作ABA问题发生的场景
- CAS下ABA问题及优化方案
- CAS操作实现并发的优势、以及实现一个无锁队列、怎样解决ABA 问题
- 多线程(十二)CAS 和ABA问题
- CAS和ABA问题
- CAS-什么是ABA问题
- 无锁编程(四) - CAS与ABA问题
- CAS操作ABA问题发生的场景
- java CAS 和ABA问题
- 无锁编程(四) - CAS与ABA问题
- 谈论高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference看看如何解决源代码CAS的ABA问题
- CAS下ABA问题及优化方案
- 【Java并发编程】2、无锁编程:lock-free原理;CAS;ABA问题
- Java CAS 和ABA问题