下面代码用Unsafe读取数组时计算偏移量的逻辑如何?

  1. 示例代码
package com.website.unsafe;

import sun.misc.Unsafe;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Modifier;

/**

* Unsafe

*/

public class UnsafeDemo {

public static void main(String[] args) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {

Class<Unsafe> clazz = Unsafe.class;

Field unsafeField = clazz.getDeclaredField("theUnsafe");

unsafeField.setAccessible(true);

Unsafe unsafe = (Unsafe)unsafeField.get(null);

int[] temp = {1, 2, 3};

int base = unsafe.arrayBaseOffset(int[].class);

int scale = unsafe.arrayIndexScale(int[].class);

int shift = 31 - Integer.numberOfLeadingZeros(scale);

for (int i = 0; i < temp.length; i++) {

System.out.println(unsafe.getInt(temp, ((long) i << shift) + base));

}

}

}

上面的代码实际上是来来源于
java.util.concurrent.atomic.AtomicIntegerArray#checkedByteOffset 中使用 Unsafe 对数组中每个元素进行原子性操作

  1. 我的问题
  • 偏移量计算逻辑
    关于偏移量 offset: ((long) i << shift) + base)这里的shift的计算方式是怎么计算出来的, base 是16也就是第一个元素的偏移地址,我觉得直接 base + i * scale 就可以得到 offset 了.
  • base为什么是16
    另外就是 base 为什么是16, 这里(数组对象头不是有 markword, klcass, pointer 数组大小), 我是 64win10 ,也就是8 + 8 + 8(没有开启 +UseCompressedOops 选项), 这也大于16啊?

以上是 下面代码用Unsafe读取数组时计算偏移量的逻辑如何? 的全部内容, 来源链接: utcz.com/p/944796.html

回到顶部