CAS详解附源码

CAS定义:

CAS 也就是CompareAndSwap 比较并交换,主要为了解决多线程下的原子性,大体思想就是在更新前,进行比较,举个例子AtomicInteger 下的compareAndSet(expect,update) expect 为期望值也就是未更新的值,update是如果期望值相同则更新的值。

原理:

首先compareAndSe调用了rt.jar下的Unsafe类,这个类下的大部分方法和变量都用native修饰,也就是说更多的是操作是面向地址的,也就是当我们调用时会形成系统原语,原语的执行是连续的,因此保证原子性。

源码解析:

如何保证原子性

1.在compareAndSet方法下的第一层

// setup to use Unsafe.compareAndSwapInt for updates
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset 
static {
    try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}

private volatile int value;
public final int getAndIncrement() {
    //this这个对象 valueoffset对应地址值,1累加
    return unsafe.getAndAddInt(this, valueOffset, 1);
}

 

 

unsafe.class下的实现

 

 public final int getAndAddInt(Object var1, long var2, int var4) {
*         int var5;
*         do {
var1这个对象var2.地址偏移量(内存地址)
*             var5 = this.getIntVolatile(var1, var2);//获取当前值
*         } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)
*         //CAS比较如果为true跳出循环var5+var4执行加操作反之亦然);
*
*         return var5;
*     }

缺点

底层实现使用了do while 因此消耗地址

2.只能保证一个共享变量的原子操作

3.ABA问题(下一篇更新)unsafe 源码https://zhuanlan.zhihu.com/p/37579394

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值