CAS是什么?
CAS的全程为Compare-And-Swap,它是一条CPU并发原语
它的功能是判断内存某个位置的值是否为预期值,如果是则更新为新的值,这个过程是原子的
CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用Unsafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。
这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,
是由诺干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说,
CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题。
Unsafe
CAS的缺点
- 循环时间长开销大
如果CAS失败,会一直进行尝试。如果CAS长时间一直不成功,可能会给CPU带来很大的开销 - 只能保证一个共享变量的原子操作
- 引出来ABA问题
CAS算法的实现,一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差内会导致数据的变化。
比如说一个线程one冲内存位置V中去除A,这时候另一个线程two也从内存中去除A,并且线程two进行了一些操作将值变成了B,然后线程two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中的值仍然是A,其实内存数据已经发生了变换,然后线程one操作完成
尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的!!
面试问题的流程
CAS–UnSafe–CAS底层思想–ABA --原子引用更新–如何规避ABA问题