- 什么是CAS
CAS(compare and swap或者compare and exchange):比较并且替换。
- 直接上图
- 下面解释一下具体的执行流程
- 假设有一个线程A拿到内存中的一个整数N,并对这个N进行加1操作。
- 当执行完计算后,重新放入内存中时,首先会再次从内存中拿出N和之前拿出的N进行比较,如果两次取出的N值相同,则把计算完成的新值放入内存中;如果不同,则使用新值N重新计算,然后放入内存中之前,重复以上比较操作,直到前后两次获得的N值相同,然后写入内存中。
- 对于上面的解释,可能会有一个疑问,如果在比较的时候,有其他的线程B修改了这个值怎么办?
- 在执行比较和替换的时候, Java代码最终会调用底层的汇编方法:
lock cmpxchg
- lock指令会告诉其他CPU当前指令只能我自己执行,不允许被打断,所以即使其他线程想要修改,也要等到当前线程执行完成。
- cmpxchg指令表示取出内存中的值和当前值进行比较,指令本身不是原子性,搭配lock指令才是原子性。
- 那什么是ABA问题呢?
ABA问题就是,假设内存中一个变量N,值为1,当N经过多次操作之后,最终的值又回到了1,虽然值没有发生变化,但是中间经历了其他的一些列过程。那如何保证现在取到的1就是最初的值呢,只要在这个值上加上一个版本号,在比较值的时候,同时比较版本号是否相同就可以了。
都已经看到这里了,点个关注再走呗
微信公众号搜一搜【虚竹讲程序经】,关注后回复【面试】,获取一线大厂面试资料和优秀简历模版