码迷,mamicode.com
首页 > 其他好文 > 详细

CAS

时间:2019-11-11 18:22:30      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:ras   black   nbd   xsd   mha   中断   缺点   span   原子操作   

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

标签:ras   black   nbd   xsd   mha   中断   缺点   span   原子操作   

原文地址:https://www.cnblogs.com/chengcanhua/p/11837184.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!