聊聊你对CAS的理解?
- CAS(CompareAndSwap)是比较并交换
- 它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的
- CAS并发原语体现在Java语言中就是sum.misc,Unsafe类中的各个方法
- 调用Unsafe类中的CAS方法,JVm会帮我们实现出CAS汇编指令;这是一种完全依赖于硬件的功能,通过它实现了原子操作
- 原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题
- 缺点
- 循环时间长开销大
- 只能保证一个共享变量的原子操作
- 引出ABA问题?
- CAS算法实现一个重要前提需要取内存中某时刻的数据并在当下时刻比较替换,那么在这个时间差可能存在数据被其他线程多次修改;
- 比如:有两个线程同时取出主内存中的值都是A,但是线程执行时间存在差异,可能存在第二个线程把A修改为B,然后再修改为A;这样第一个线程是不知道这个修改过程的;第一个线程虽然修改成功,但是不代表这个过程没有问题的