美文网首页
Atomic原子类

Atomic原子类

作者: 卡路fly | 来源:发表于2020-06-11 13:56 被阅读0次

来源:https://www.cnblogs.com/czsy/archive/2019/05/25/10921935.html

CAS

CAS全程Compare And Swap ,是条并发原语,功能是判断内存中某个值是否与预期值相等,相等就用新值更新旧值,否则不更新。

Java中CAS是基于unsafe类实现的,所有的unsafe类中的方法都是native类修饰的,直接调用操作系统底层资源执行响应的任务。

unsafe.compareAndSwapInt(this, valueOffset, expect, update);

AtomicInteger类初始化

// 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;

上述代码是AtomicInteger类的默认参数初始化过程。其中value就是我们想要进行操作的那个值。
加上volatile是为了保证修改该值后立马被其他线程感知到。

刚开始实例化unsafe类,这没什么好说的,因为AtomicInteger类中方法都是通过unsafe类中方法来操作的。在静态代码块中通过

unsafe.objectFieldOffset方法获取value值的偏移量。也可以说是引用地址,以后通过该地址就可以随时获取value值和更改value值

AtomicInteger中方法的执行流程

这里我们以常用的getAndIncrement方法为例

/**
     * Atomically increments by one the current value.
     *
     * @return the previous value
     */
    public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

可以看到,该方法是调用unsafe类中的getAndAddInt方法,继续跟踪该方法,进入unsafe类源代码中

可以看到,调用unsafe类中getIntVolatile方法,方法参数var1为传入的对象,即上述的AtomicInteger类的对象

var2为偏移地址,该方法的作用是通过该对象的偏移地址找到值,也就是找到上文的value值。

PS: 这里已经不是在AtomicInteger类源代码中了而是进入了Unsafe类源代码中,所以这里的this.getIntVolatile是unsafe类中的getIntVolatile方法,该方法不是在AtomicInteger类中!

获取到目前的value值后调用compareAndSwapInt方法,使用获取到的value值和当前当前对象地址偏移量中的值进行比较,如果相同就更新值,并且退出循环,否则就继续进入循环获取该偏移地址中的最新值。为什么这里会导致使用var5 = getIntVolatile获取偏移地址中的值后后面compareAndSwapInt方法var5又会出现不等于偏移量地址上的值呢?按道理来说两次获取同一个偏移地址上的值是肯定会相同的,但是这里我们

考虑多线程的情况下,当两个线程同时获取当前偏移地址上的值,由于compareAndSwapInt是原子操作,所以必定有一个线程会先执行完,并且改掉内存偏移地址上的值,那么另一个线程就会出现两次获取内存偏移地址上的值却不一致的情况,

出现这种情况就需要重新获取该值并且在此执行compareAndSwapInt,直到成功为止。

CAS与synchronized比较

  • CAS支持多个线程并发修改。并发程度高

  • synchronized一次只有一个线程修改,并发程度较低

  • CAS只支持一个共享变量的原子操作

  • synchronized可以对个变量进行加锁

  • CAS会出现ABA
    问题

相关文章

  • Atomic原子类

    1 AtomicInteger+AtomicLong+AtomicBoolean+AtomicReference ...

  • Atomic原子类

    来源:https://www.cnblogs.com/czsy/archive/2019/05/25/109219...

  • AtomicBoolean源码解析

    1.原子类 java.util.concurrent.atomic包下有很多原子类,这些原子类扩展了vola...

  • 原子类

    一、原子类纵览 类型具体类Atomic* 基本类型原子类AtomicInteger、AtomicLong、Atom...

  • Java并发之JUC原子类(5)

    1 今天我们来聊聊java.util.concurrent.atomic包下的原子类,所谓原子类就是具有原子/原子...

  • 原子类型与原子操作

    原子类型 c++11提供了原子操作类型, 模板类std::atomic。头文件#include 内存模型 在原子类...

  • JUC Atomic原子类深入

    什么是Atomic Atomic是原子性的意思,可以自动更新,用于原子增量计数器之类的应用程序。可以解决多线程环境...

  • 内存模型,顺序一致性

    对于同步,c++11添加了几个原子类型,类型如下atomic_xxx(atomic_int等),对于一般的线程之间...

  • Java中高级核心知识全面解析——Atomic(什么是Atomi

    一、Atomic 原子类介绍 Atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,...

  • Atomic类型组

    原子类型。 在concurrent.atomic包中定义了若干原子类型,这些类型中的每个方法都是保证了原子操作的。...

网友评论

      本文标题:Atomic原子类

      本文链接:https://www.haomeiwen.com/subject/vhrbtktx.html