标签:ras black nbd xsd mha 中断 缺点 span 原子操作
CAS(Compare And Swap):比较并交换,它是一条并发原语。
原语属于操作系统用语范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条原子指令,不会造成所谓的数据不一致问题。
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了,所有比较失败,没有进行修改。
自旋锁和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存在jdk/jre/lib目录下的rt.jar中,简单来说就是出娘胎就带着的。
它是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地方法(native)来访问,Unsafe类相当于一个后门,基于该类可以值操作特定内存的数据。Unsafe类存在与sun.mise包中,其内存操作方法可以像C的指针一样直接操作内存,因为Java中CAS操作的执行依赖与Unsafe类的方法。
注意:Unsafe类中基本上所有方法都是native修饰的,也就是说它可以直接调用操作系统的底层资源执行相对应的任务。
1.循环时间长开销大;
2.只能保证一个共享变量的原子操作;
3.ABA问题。
标签:ras black nbd xsd mha 中断 缺点 span 原子操作
原文地址:https://www.cnblogs.com/chengcanhua/p/11837184.html