从AtomicXXX稍微说一下Unsafe

来源:互联网 发布:可信的淘宝货源 编辑:程序博客网 时间:2024/06/05 09:27

无聊看了一眼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

原创粉丝点击