https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html
搜索 arrayBaseOffset 可快速定位到举的例子
举的例子的图片里说,unsafe.arrayBaseOffset(int[].class) 能获取到数组首元素地址。。
可首先,这个是静态的,final 的,不可能不同 AtomicIntegerArray 实例有着不同的地址,但不同 AtomicIntegerArray 的实例内的数组不是同一个吧?
比如说
public static void main(String[] args) {
AtomicIntegerArray a = new AtomicIntegerArray();
AtomicIntegerArray b = new AtomicIntegerArray();
}
a 和 b 内部真的用来存储数据的数组不能同一个,那么它们各自的数组的起始地址应该不一样。但由于 private static final int base = unsafe.arrayBaseOffset(int[].class);
中 static final
的限定,base 不可能在 a 和 b 中不一样,那接着用 base 以及元素地址增量 scale 去算数组中某个元素的内存地址,怎么可能算对呢?
谢谢
1
Newyorkcity OP 那还有一种理解就是 unsafe.arrayBaseOffset(int[].class) 得到的是这个类中类型为 int[].class 的成员相对于对象起始地址的偏移值。。但如果是这样,为什么不使用
U.objectFieldOffset(klass.getDeclaredField("array")); 呢? 在一个类中如果有两个类型为 int[].class 的成员,那么会不会导致方法错误? |