浅析CAS操作
CAS机制
CAS是是Compare And Swap 的缩写,翻译过来就是比较交换。CAS是Java并发编程的核心组成部分,不论是synchronized的各种优化,还是lock系列的锁,都离不开CAS。CAS操作是一种乐观锁策略。
CAS是一个原子操作,虽然有比较和交换操作,这个是硬件指令集的支撑,在JDK1.5之后,虚拟机才可以使用处理器提供的CMPXCHG指令实现。
CAS的操作过程
CAS有三个操作数,内存地址的实际值V,旧的预期值O,更新后的值N。
当一个线程访问内存时,预期内存中的值和内存实际存放的值相等,即 V == O时,说明自该线程上次修改过之后,其它线程没有访问且修改过该值,因此这个线程可以再次修改这个值,即内存中的实际值V更新成N。但是此时如果预期的值和实际存放的值不一致,说明其它线程已经把这个值更改过了,此时就不能直接修改了,可能会破坏别的线程的数据。因此这个线程重新获取内存中的V值,重新计算要修改的值,再次去尝试修改直到V == O时修改成功。否则反复执行这个过程,反复尝试的过程称为自旋。
CAS的缺点
浪费CPU资源
一直反复自旋,造成CPU资源的 白白浪费,给CPU带来压力。
不能保证代码块的原子性
CAS机制仅仅能够保证一个变量的原子性操作,不能保证多个变量或者整个代码块的原子性。
ABA问题
假如内存中的值为10,B线程将其修改为11,而C线程又改回10,此时A线程去修改该值,发现就是10 和自己预期的一样,因此直接修改。即存在一个10 -> 11 --> 10的转换问题简称ABA问题,为了解决这个问题只需加一个版本号即可,第一次的10版本为01,第二次的版本为02,而线程A期望的是版本为01的10,而此时时版本为02 的10,所有不能修改,需要自旋尝试.