美文网首页
AtomicXXXArray类实现原理

AtomicXXXArray类实现原理

作者: plan454 | 来源:发表于2017-02-08 23:59 被阅读0次

背景知识:

介绍:

AtomicXXXArray 包括AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray 三个主要类别,是对不同类型数组进行一个原子操作实现。实现方式为CAS

实现原理:

类在初始化时获取数组在起始位置以及偏移量

   static {
       //获取数组的元素所占空间大小,即比例因子
        int scale = unsafe.arrayIndexScale(int[].class);
       //判断其必须为2的指数倍
        if ((scale & (scale - 1)) != 0)
            throw new Error("data type scale not a power of two");
       //获取该比例因子二进制中1 在第几位,(十进制)4 = (二进制)100,故计算出来的shift 为 3   
       shift = 31 - Integer.numberOfLeadingZeros(scale);
    }

通过shift及base 查找下标为 i 的偏移量

private long checkedByteOffset(int i) {
        if (i < 0 || i >= array.length)
            throw new IndexOutOfBoundsException("index " + i);

        return byteOffset(i);
    }

//可以证明  i * scale + base == i << shift + base
    private static long byteOffset(int i) {
        return ((long) i << shift) + base;
    }

获取到偏移量,便可以通过

 unsafe.getIntVolatile(array, offset); 

来获取到下标 i 的值了。
根据数组和偏移量,便可根据CAS方式进行数据的更新了,CAS实现类似于AtomicBoolean

相关文章

  • AtomicXXXArray类实现原理

    背景知识: sun.misc.Unsafe 类的运用,参见 http://ifeve.com/sun-misc-u...

  • 2018-08-08

    java集合类的底层实现 LinkedList底层实现和原理 LinkedList类是List接口的实现类,它是一...

  • Load和Initialize实现原理

    Load和Initialize实现原理 +Load实现原理 +load方法会在runtime加载类、分类时调用 每...

  • 100篇技术文章

    1.Class类的底层实现原理 - 链接 链接 2.Category分类的底层实现原理 - 链接 3.Block块...

  • 2018-08-08

    Java集合类的底层实现 Vector底层实现和原理 Vector作为List的另外一个典型实现类,完全支持Lis...

  • java 动态代理

    动态代理模式介绍 实现原理 设计动态代理类(DynamicProxy)时,不需要显式实现与目标对象类(RealSu...

  • String类源码解读

    string类是final类型的不可变类。 实现原理:底层实现为final类型的char数组 设计亮点: 1.ha...

  • 注解

    注解实现原理 底层使用反射实现。申明注解类需要加 @interface 注解类里只支持基本类型、String以及枚...

  • Android10分钟手写热修复

    目录 效果展示 实现原理 Android中的类加载也是通过ClassLoader实现的,它加载类的时候是顺序遍历一...

  • 探究 Kotlin 类代理

    Kotlin 实现类代理是通过 by 关键字,本文尝试讲解类代理在 Kotlin 的具体使用和实现原理。 首先,在...

网友评论

      本文标题:AtomicXXXArray类实现原理

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