请稍等 ...
×

采纳答案成功!

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

正在回答

1回答

Jimin 2018-05-27 17:59:25

你好,这篇手记 https://www.imooc.com/article/25277 我做了一些问题的整理,包括cas,你这个我单独复制出来:

关于CAS中compareAndSwapInt(var1, var2, var5, var5 + var4)的理解
compareAndSwapInt(var1, var2, var5, var5 + var4)换成 compareAndSwapInt(obj, offset, expect, update)能清楚一些,如果obj内的value和expect相等,就证明没有其他线程改变过这个变量,那么就更新它为update,如果这一步CAS没有成功,那就采用自旋的方式继续进行CAS操作。这块是一个CPU指令完成的,依旧是原子操作。

继续回答一下你的疑问。这里不会出现死循环。因为对比和更新的操作是通过一条cpu指令执行的,如果期望值检查通过更新了的话会返回true,循环就直接退出了。如果期望值检查不通过没更新会返回false,这是更新期望值为最新的值,再尝试更新,直到返回true。

1 回复 有任何疑惑可以回复我~
  • 提问者 慕粉13799323360 #1
    谢谢老师;我大概明白这个意思了;就是期望值检查不通过没更新会返回false,这时期望值会被更新为最新值,再做尝试;这样总有一次会成功。
    回复 有任何疑惑可以回复我~ 2018-05-27 18:55:10
  • 老师,这里是不是没回答第2个疑问。如果判断obj内的value和expect值相等了,这时线程暂停,别的线程更改了这个expect值,那么等到我这个线程恢复后,再更新就会出错了吧。
    回复 有任何疑惑可以回复我~ 2018-06-09 17:33:35
  • 是不是说通过一条cpu指令完成的,所以不可能出现第二个问题吗?
    回复 有任何疑惑可以回复我~ 2018-06-09 17:35:17
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信