CAS (compare and swap) 比较与交换
一谈到锁,很多时间就会涉及到“阻塞等待”,只要代码加锁了,那这段代码就很可能与“高性能”无缘了。因此,为了实现线程安全又兼并高性能,CAS就应运而生了。
CAS是一条cpu指令 ,证明它是原子的。它可以想象成一个方法:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/96978a0f3f584e2493b1daeccc883da0.png
大体上是可以看成这样子。其实Java中,也有类对CAS进行了进一步的封装。最典型的便是“原子类”。
由于Java不支持运算符重载,无法针对原子类进行++ --操作,于是就通过方法来替代原有的运算符。
通过上述方法就可以实现不加锁的++ --运算了。由于它们都是原子的,所以都是线程安全的,有效地提高了安全性和效率。下面我写一个基于CAS实现自旋锁的伪代码来给你们方便理解:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/41a3b1755b034fb89fbd02fc95d68d28.png
注意:CAS的核心是“比较-发现相等-交换” =》 发现相等并不等于数据中间没有发生改变。
这种情况下,CAS是无法区分的,但大多情况下,影响不大。除非是极端情况,可能会出现bug!