CAS是什么也就是比较并交换(compareAndSet)CAS全称为Compare-And-Swap,它是一条CPU并发原语。调用Unsafe类中的CAS方法,JVM发出CAS汇编指令,这是偏硬件的功能。而原语的执行必须是连续的,在执行过程中不允许被终端。也就说CAS是一条CPU的原子指令。
CAS底层原理:
AtomicInteger类下:
private static final Unsafe unsafe=Unsafe.getUnsafe();
private static final llong valueOffset;
static{
try{
valueOffset=unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField(“value”));
}catch(Exception ex){throw new Error(ex);
}
}private volatile int value;
- Unsafe是CAS的核心类,存在于sun.misc包中 注:Unsafe类中的所有方法都是native修饰的,其中的方法都是直接调用操作系统底层的资源执行相应的任务
- 变量valueOffset表示变量值在内存总的偏移地址,Unsafe就是根据内存偏移地址获取数据的
public final int getAndIncrement(){
return unsafe.getAndAddInt(this,valueOffset,1);
}
- 变量value用volatile修饰,保证了多线程之间的内存可见性
图为2中底层代码的详细讲解
CAS小总结
CAS的缺点:
- 循环时间长,开销比较大
- 只能保证一个共享变量的原子操作
- 引出来的ABA问题:CAS算法实现的一个重要前提需要去除内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差内会导致数据的变化
原子类AtomicInteger的ABA问题,原子更新引用
原子引用:
时间戳的原子引用;
原子引用+一种新机制à修改版本号(类似于时间戳)