其他分享
首页 > 其他分享> > CAS

CAS

作者:互联网

CAS是什么?

CAS(Compare  And  Swap):比较并交换,它是一条并发原语。

原语属于操作系统用语范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条原子指令,不会造成所谓的数据不一致问题。

compareAndSet方法

public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

这是compareAndSet方法的源码,第一个参数是期望值,第二个参数是更新值,返回值是boolean类型。如果它的期望值与线程中的真实值一致,比较成功,把线程中值替换为更新值,如果比较失败,值不会改变。

代码演示:

 

// AtomicInteger不给值默认为0
AtomicInteger atomicInteger = new AtomicInteger(5);
System.out.println(atomicInteger.compareAndSet(5,2019)+"\t 修改结果:"+atomicInteger.get());
System.out.println(atomicInteger.compareAndSet(5,2014)+"\t 修改结果:"+atomicInteger.get());

运行结果:

第一次比较,期望值为5,真实值也为5,所有修改成功,就跟新值。第二次比较期望值为5,而真实值已经被修改成为2019了,所有比较失败,没有进行修改。

CAS的底层原理是什么?

自旋锁和UnSafe类。

为什么?

源码:

AtomicInteger类中源码:
private static final Unsafe unsafe = Unsafe.getUnsafe();
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
compareAndSet()方法里调用了UnSafe类中compareAndSwapInt()方法,其中this指当前对象,valueOffset值的是内存偏移地址,expect期望值,update更新值。

 

UnSafe类是什么?

UnSafe存在jdk/jre/lib目录下的rt.jar中,简单来说就是出娘胎就带着的。

是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地方法(native)来访问,Unsafe类相当于一个后门,基于该类可以值操作特定内存的数据。Unsafe类存在与sun.mise包中,其内存操作方法可以像C的指针一样直接操作内存,因为Java中CAS操作的执行依赖与Unsafe类的方法。

注意:Unsafe类中基本上所有方法都是native修饰的,也就是说它可以直接调用操作系统的底层资源执行相对应的任务。

CAS的缺点

1.循环时间长开销大;

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

3.ABA问题。

标签:CAS,Unsafe,update,atomicInteger,compareAndSet,expect
来源: https://www.cnblogs.com/chengcanhua/p/11837184.html