关于CAS的问题
来源:3-1 线程安全性-原子性-atomic-1
![](http://img1.sycdn.imooc.com/user/5458456b0001812002200220-100-100.jpg)
幕布斯9518984
2021-01-18
假设线程A和线程B同时执行getAndAdd操作(分别跑在不同CPU上):
AtomicInteger里面的value原始值为3,即主内存中AtomicInteger的value为3,根据Java内存模型,线程A和线程B各自持有一份value的副本,值为3。
线程A通过getIntVolatile(var1, var2)拿到value值3,这时线程A时间片结束被挂起。
线程B也通过getIntVolatile(var1, var2)方法获取到value值3,运气好,线程B没有被挂起,并执行compareAndSwapInt方法比较内存值也为3,成功修改内存值为2。
这时线程A恢复,执行compareAndSwapInt方法比较,发现自己手里的值(3)和内存的值(2)不一致,说明该值已经被其它线程提前修改过了,那只能重新来一遍了。
现在的问题是:如果线程A每次循环看见value的值都不是3,那么线程A是不是要一直循环下去,如果不是,那要怎么样才能结束这个循环呢?
写回答
1回答
-
你好,每次循环时会强制从内存里那最新的值,更新当前的值,然后用最新的值去重新操作,后续就不再是拿3了,正常只有在拿完最新的值之后其他cpu有更新才会在cas时判断失败再来一次,否则一次基本就OK了
012021-01-20
相似问题