关于CAS的问题

来源:3-1 线程安全性-原子性-atomic-1

幕布斯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回答

Jimin

2021-01-19

你好,每次循环时会强制从内存里那最新的值,更新当前的值,然后用最新的值去重新操作,后续就不再是拿3了,正常只有在拿完最新的值之后其他cpu有更新才会在cas时判断失败再来一次,否则一次基本就OK了

0
1
幕布斯9518984
好的,谢谢老师
2021-01-20
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程