一张图带你彻底了解CAS

  • 什么是CAS

CAS(compare and swap或者compare and exchange):比较并且替换。

  • 直接上图

  • 下面解释一下具体的执行流程
  1. 假设有一个线程A拿到内存中的一个整数N,并对这个N进行加1操作。
  2. 当执行完计算后,重新放入内存中时,首先会再次从内存中拿出N和之前拿出的N进行比较,如果两次取出的N值相同,则把计算完成的新值放入内存中;如果不同,则使用新值N重新计算,然后放入内存中之前,重复以上比较操作,直到前后两次获得的N值相同,然后写入内存中。
  • 对于上面的解释,可能会有一个疑问,如果在比较的时候,有其他的线程B修改了这个值怎么办?
  1. 在执行比较和替换的时候, Java代码最终会调用底层的汇编方法:
lock cmpxchg
  1. lock指令会告诉其他CPU当前指令只能我自己执行,不允许被打断,所以即使其他线程想要修改,也要等到当前线程执行完成。
  2. cmpxchg指令表示取出内存中的值和当前值进行比较,指令本身不是原子性,搭配lock指令才是原子性。
  • 那什么是ABA问题呢?

ABA问题就是,假设内存中一个变量N,值为1,当N经过多次操作之后,最终的值又回到了1,虽然值没有发生变化,但是中间经历了其他的一些列过程。那如何保证现在取到的1就是最初的值呢,只要在这个值上加上一个版本号,在比较值的时候,同时比较版本号是否相同就可以了。

都已经看到这里了,点个关注再走呗
微信公众号搜一搜【虚竹讲程序经】,关注后回复【面试】,获取一线大厂面试资料和优秀简历模版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值