请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

https://img1.sycdn.imooc.com//szimg/5be044f400018c8e10070339.jpg

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

正在回答 回答被采纳积分+3

1回答

Jimin 2018-11-05 22:26:57

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

0 回复 有任何疑惑可以回复我~
  • 提问者 李爽爽爽爽 #1
    老师,按照您课程上的逻辑,不是说线程在处理对象的时候,会将对象的副本拷贝到线程所在的工作内存,那么,是不是cas返回为false的时候,线程工作内存里面的对象会进行更新。
    回复 有任何疑惑可以回复我~ 2018-11-06 10:34:11
  • Jimin 回复 提问者 李爽爽爽爽 #2
    是的,那里的循环就是不断取出主存里的最新的值更新到当前工作线程的副本里,继续尝试,直到尝试成功。
    回复 有任何疑惑可以回复我~ 2018-11-06 10:48:29
  • 提问者 李爽爽爽爽 回复 Jimin #3
    恩恩明白了,谢谢老师!
    回复 有任何疑惑可以回复我~ 2018-11-06 11:09:48
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信