CAS(Compare and swap 或者 Compare and exchange) 比较和交换 (无锁算法)
jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。
过程(整个过程没有加锁):
- 读取当前内存的值E到自己的工作空间;
- 根据处理得到结果值V;
- 再次读取内存的最新值N和自己读取的值E进行比较;
- 如果相等(在相等的时候有可能存在一个ABA问题,即可能在此过程中,该值被其他线程经过多次修改又恢复到了原来的值),则将内存的值更新为自己的结果值V; 对于ABA问题可以通过一些方式来知道(比如可以通过版本号来确定别人是否修改过该值)
- 如果不相等(说明在此期间已经有其他的线程对该值进行了修改),则重新读取,在重复进行上述过程;
在这个过程中,会有疑问说万一在最后更新值的时候有其他线程对值进行了修改怎么办?这个问题的避免在于CAS算法的原子性。(对这一概念我还不是很懂,嘻嘻嘻)
CAS算法追踪到源码之后便会发现主要在于指令:
lock cmpxchg
其中cmpxchg指令并不能实现它的原子性,主要还是依靠前面的lock指令才能保证它的原子性;
在原子类变量中,如java.util.concurrent.atomic中的AtomicXXX,都使用了这些底层的JVM支持为数字类型的引用类型提供一种高效的CAS操作,而在java.util.concurrent中的大多数类在实现时都直接或间接的使用了这些原子变量类。
作者:stadol
链接:https://www.jianshu.com/p/ab2c8fce878b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考视频做的笔记!!!
参考视频连接:https://www.bilibili.com/video/BV1xK4y1C7aT?from=search&seid=11597545524554290786