美文网首页
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类实现原理

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