主内存的内容和工作区内容不一样

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

李爽爽爽爽

2018-11-05

http://img.mukewang.com/szimg/5be044f400018c8e10070339.jpg

老师你好,对于cas算法,如果var1对象的变量var2和从主内存中读取出来的var5不一样的话,系统里面会进行什么操作,更新var1对象还是说直接把主内存里面的东西全部读取到工作内存?还是怎么样?

写回答

1回答

Jimin

2018-11-05

你好,compareAndSwapInt是cas的核心,这个方法里传入的参数包含了 当前工作线程的值、更新后的值。
执行这个方法时,其实是调用cpu的一条指令去执行的,当这条cpu指令执行时,会校验主存里的最新值和当前工作线程里的值是否相同,如果相同,则更新为目标值,返回true,不同的话不更新且返回false。这一次到这里就执行完了。
如此,可以看出一次cas执行并不一定能完成更新,因此这里引入了while循环。返回false时,则通过getIntVolatile方法(相当于使用了volatile关键字)来获取最新主存的值,更新传入cas中的参数:当前工作线程最新值、调整后更新值。
继续执行compareAndSwapInt,如果返回false则不断更新当前工作线程值和调整后更新的值(说明此时并发修改这个值的线程很多),直到返回true,这时更新成功。

0
3
李爽爽爽爽
回复
Jimin
恩恩明白了,谢谢老师!
2018-11-06
共3条回复

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

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

3923 学习 · 832 问题

查看课程