CAS及其引起的ABA问题

CAS是什么也就是比较并交换(compareAndSetCAS全称为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;
  1. Unsafe是CAS的核心类,存在于sun.misc包中 注:Unsafe类中的所有方法都是native修饰的,其中的方法都是直接调用操作系统底层的资源执行相应的任务
  2. 变量valueOffset表示变量值在内存总的偏移地址,Unsafe就是根据内存偏移地址获取数据的

    public final int getAndIncrement(){

        return unsafe.getAndAddInt(this,valueOffset,1);

    }

  1. 变量valuevolatile修饰,保证了多线程之间的内存可见性

图为2中底层代码的详细讲解

CAS小总结

CAS的缺点:

  1. 循环时间长,开销比较大
  2. 只能保证一个共享变量的原子操作
  3. 引出来的ABA问题:CAS算法实现的一个重要前提需要去除内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差内会导致数据的变化

原子类AtomicInteger的ABA问题,原子更新引用

       原子引用:

       时间戳的原子引用;

              原子引用+一种新机制à修改版本号(类似于时间戳)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值