美文网首页
AtomicIntegerArray引发的思考

AtomicIntegerArray引发的思考

作者: AlanSun2 | 来源:发表于2019-09-19 17:38 被阅读0次

最近看AtomicIntegerArray,有一段代码把我搞懵了,请看:

    static {
        int scale = unsafe.arrayIndexScale(int[].class);
        if ((scale & (scale - 1)) != 0)
            throw new Error("data type scale not a power of two");
        shift = 31 - Integer.numberOfLeadingZeros(scale);
    }

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

        return byteOffset(i);
    }

    private static long byteOffset(int i) {
        return ((long) i << shift) + base;
    }

这里兜了一个大权来计算第i个元素的偏移量,我的猜想是为了性能考虑。看到这里真的感叹Doug Lea真牛逼,性能都是一点点抠出来的。6666666!!!

这里解释下 31 - Integer.numberOfLeadingZeros(scale),它的作用是把scale 转换为二进制左移的需要的位数。例如,4 相当于 << 2,8 相当于 << 3。

这里说明下为什么X % 2^n == X & 2^n -1。
首先 X 取模相当于要获得 X / 2^n 后留下一个比 2^n 小且最接近 2^n 的数。我们再来看下 X & 2^n -1,2^n - 1 转为二进制正好是一个比 2^n - 1 且每个位置都是1的二进制数,& X 相当于对X的低位上的1进行保留,所以留下来的数肯定是一个 <= 2^n - 1 的数。也就是 X % 2^n 的余数。

相关文章

  • AtomicIntegerArray引发的思考

    最近看AtomicIntegerArray,有一段代码把我搞懵了,请看: 这里兜了一个大权来计算第i个元素的偏移量...

  • J.U.C之Atomic:数组类型的原子类

    数组类型的原子类 AtomicIntegerArray AtomicIntegerArray 主要时用来封装对数组...

  • J.U.C 原子类系列之AtmoicIntegerArray

    简介 原子化数组包括:AtomicIntegerArray、AtomicLongArray 和 AtomicRef...

  • 原子操作类-数组(volatile+CAS循环;baseOffs

    以AtomicIntegerArray为例。 1.构造器和域 2.方法 2.1 采用baseOffset + i*...

  • 引发的思考

  • 引发的思考

    一、 每天进店的各色人群中,我根据他们的行为举止大概可以归纳他们的品性怎么样: 有的人结账的时候,十分的客气,他们...

  • 造纸行业

    纸巾引发的思考

  • 引发思考

    今天参加了远道而来的学习培训班,学习用NLP的技术解决,企业文化与管理脱节的问题。 这是一个历时三个小时的培训课堂...

  • 引发思考

    刚刚步入职场,慢慢的发现一切都和以前的学生生涯有所不同。 当学生的时候可以默默地做自己喜欢的事,不用担心该是自己的...

  • 引发思考

    知乎链接-1,每天什么都不想做怎么办 知乎链接-2,人迷茫的时候该干什么

网友评论

      本文标题:AtomicIntegerArray引发的思考

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