下面代码用Unsafe读取数组时计算偏移量的逻辑如何?
- 示例代码
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 对数组中每个元素进行原子性操作
- 我的问题
- 偏移量计算逻辑
关于偏移量 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