您的位置:首页 > Web前端

从AtomicXXX稍微说一下Unsafe

2017-08-10 18:54 78 查看
无聊看了一眼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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  concurrent 源码 java