什么是CAS?
比较并交换(Compared-And-Swap),它是一条CPU并发原语。
它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。
CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题。
后边的那个线程没有抢到,所以期望值和主物理内存的值不一样,修改失败。
CAS底层原理
前面我们用到了这个方法(以原子的方法将当前值加1)
上面的 源码合并到下面这一张图上,unsafe的底层实现原理是CAS原理
假设当前对象的值为5,它的地址在var2里边,
当前对象的那个值如果比较成功了,加1,不成功继续执行while循环重新获取
总结:
比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较直到主内存和工作内存中的值一致为止.
CAS应用
CAS有3个操作数,内存值V,旧的预期值A,要修改的更新值
当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
CAS缺点
1,循环时间长开销很大
2只能保证一个共享变量的原子操作
对于多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁来保证原子性
3会引出来ABA问题
原子引用
对某个类进行包装可以使用原子引用
ABA问题的解决
时间戳的原子引用
下边的两个线程是对于解决ABA问题的