为了账号安全,请及时绑定邮箱和手机立即绑定

CAS自旋锁的疑问

CAS自旋锁的疑问

慕工程708809 2020-03-10 16:50:13
CAS算法中的比较,应该就是将自己线程工作内存的值(M)与主内存的值(E)进行比较吧,不知道理解是否对?  如果第一次比较不相等,那么就继续while循环比较直到相等然后执行更新操作,假如线程1第一次比较失败,线程2操作成功并把主内存更新为最新值2,线程1进行第二次比较时E为2,那线程1的工作内存M值什么时候会为成2呢?还是说会一直死循环
查看完整描述

1 回答

?
慕用8428640

TA贡献1条经验 获得超0个赞

首先这里Volatile 关键字已经保证了可见性 ;

然后这段代码需要保证的是从获取到重新赋值这个过程中,没有别的线程对该值进行了修改。

在调用CAS方法的时候是传入的参数是内存地址,native方法会根据内存地址取出最新的值和传入的预期值进行比较。如果一致说明没有被修改,如果不一致说明从取出到再赋值的这个过程中已经被别的线程修改。这时候再重复做一起取值比较,直到成功。


查看完整回答
反对 回复 2020-03-10
  • 慕工程708809
    慕工程708809
    如果一直不成功,那线程会死循环吗,一直比较下去吗
  • qq_慕仙5248099
    qq_慕仙5248099
    是的,会一直循环下去。你是想问死循环什么时候结束吗? 你的理解是不是这样,既然死循环,会不会一辈子都不成功,一直循环下去 实际中并不会 如果有一万个线程进行加1操作,哪怕一个线程倒霉到家,也最多循环一万次呗,早晚会成功 当然,不会傻傻真的循环1万次 一般原子实现类中会设置一个循环次数,超过这个次数还不成功,表明此时竞争很激烈,一般等下一个时间片再尝试循环
  • 1 回答
  • 0 关注
  • 678 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信