无聊看了一眼AtomicInteger的源码,早就知道concurrent包里面大量使用了Unsafe来获取offSet,之前都以为Unsafe是拿到类似cpp指针的来直接从内存拿,今天发现不是
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafeU.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
private volatile int value;
这就很尴尬了,这valueOffset 为什么是static的,就是说所有实例的valueOffset 都是一样的?
后来查了一下objectFieldOffset的真正含义才恍然大悟
Unsafe的objectFieldOffset方法是用于拿到类的属性和类的偏移数值
unsafe.getAndSetInt(this, valueOffset, newValue);
所以unsafe的数值操作方法也要传this,对于每个实例,value的地址都是this+valueOffset