请稍等 ...
×

采纳答案成功!

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

CAS疑惑

//img1.sycdn.imooc.com//szimg/5b864850000151ce08140197.jpg

假设期望值var2等于2,更新至var4等于1

当T1执行:var5 = this.getIntVolatile(var1, var2); 获取到:var5 =2,

这时,T2获得cpu的时间,执行:var5 = this.getIntVolatile(var1, var2);  也获取到:var5 =2,

接着执行:this.compareAndSwapInt(var1, var2, var5, var5 + var4)),由于满足var2 = var5 ,

做了:var5 + var4 的操作,此时var5 等于3.

之后T1获得cpu时间,执行:this.compareAndSwapInt(var1, var2, var5, var5 + var4)),

这时T1的var5等于2还是等于3,这时我疑惑的地方,如果等于2,那满足cas,结果就会有问题,

如果等于3,那是为什么会等于3。

我有看到有人在ABA问题中也有相同的疑问,看了老师的解答我还是没明白。

---------------------------------- 分割线 ------------------------------

我又看了下老师在其他cas问题的答疑,我之前的理解有误差,说的是var5是期望值,

执行this.compareAndSwapInt(var1, var2, var5, var5 + var4)) 的时候是和var1中的值进行比较

this.compareAndSwapInt方法是这一条cpu指令执行,满足原子性。

我的新疑惑是:

var5 如果是预期值, var2的作用是什么,

如果var5 是和var1中的值进行比较,那在this.compareAndSwapInt方法里比较,应该是用预期的var5的值,和var1在主内存中的值比较才有意义把。

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

1回答

Jimin 2018-08-29 23:26:44

你好,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 回复 有任何疑惑可以回复我~
  • 提问者 zhusx #1
    复制:本质上 compareAndSwapInt (obj, offset, expect, update)这个方法是个cpu指令级的操作,能保证原子性。但是他不一定能执行成功
    这段话我能不能这样理解,这个动作有点像更新数据库的操作,类似update table set memory = update where memory = expect.
    memory是主存中的值。当执行这个操作的时候,memory被修改了,则通过var5 = this.getIntVolatile(var1, var2)  取出主存里当前最新的值。这样一切都解释的通了。
    回复 有任何疑惑可以回复我~ 2018-08-31 10:01:28

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信