请稍等 ...
×

采纳答案成功!

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

getandaddint方法问题(2)

Jimin老师,能麻烦您解决一下这个问题么,这个问题一直没人解决,我和这位同学有相同的疑问,谢谢!图片描述

正在回答

2回答

compareAndSwapInt(var1, var2, var5, var5 + var4)换成 compareAndSwapInt(obj, offset, expect, update)能清楚一些,如果obj内的value和expect相等,就证明没有其他线程改变过这个变量,那么就更新它为update,否则只是返回false。这个理解时一定要结合他所在的那个函数:
public final int getAndAddInt(Object var1, long var2, int var4) {
   int var5;
   do {
       var5 = this.getIntVolatile(var1, var2);
   } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
   return var5;
}
我们来看这一段,本质上 compareAndSwapInt (obj, offset, expect, update)这个方法是个cpu指令级的操作,能保证原子性。但是他不一定能执行成功,一旦执行不成功,则通过 var5 = this.getIntVolatile(var1, var2)  取出主存里当前最新的值,然后更新这里的expect(这时update在传入compareAndSwapInt时也会跟着更新),继续执行compareAndSwapInt (obj, offset, expect, update)操作。这样通过无锁自旋的方式不断尝试不断更新直至成功,同时来保证线程安全性,并且跳出当前的循环。在线程竞争不激烈时,可以很快的返回。
很多人对这里理解出现问题,核心在于没有明白这里这个死循环的含义。

0 回复 有任何疑惑可以回复我~
  • 提问者 LittleNiq #1
    do {
           var5 = this.getIntVolatile(var1, var2);
       } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
       return var5;
    }
    Jimin老师,最开始执行do里面的内容的时候,var5的值是一定是2么,有没有可能出现其他的情况?是在执行第二次do的时候,才有可能会出现var2 和var5不同的情况么?谢谢!!!
    回复 有任何疑惑可以回复我~ 2018-11-28 12:49:59
  • Jimin 回复 提问者 LittleNiq #2
    是否相同取决于是否有其他线程修改,如果没有其他线程修改,第一次就会检查通过进行更新
    回复 有任何疑惑可以回复我~ 2018-11-28 21:29:51
Jimin 2018-11-28 12:38:05

额,问答区展示有个问题,问题被任何人回复一次,讲师这里待回复问题列表里就出不来了,这个我今天抽空回复一下。

0 回复 有任何疑惑可以回复我~
  • 提问者 LittleNiq #1
    确实是这样哈哈
    回复 有任何疑惑可以回复我~ 2018-11-28 12:51:13
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信