从AtomicXXX稍微说一下Unsafe
2017-08-10 18:54
78 查看
无聊看了一眼AtomicInteger的源码,早就知道concurrent包里面大量使用了Unsafe来获取offSet,之前都以为Unsafe是拿到类似cpp指针的来直接从内存拿,今天发现不是
这就很尴尬了,这valueOffset 为什么是static的,就是说所有实例的valueOffset 都是一样的?
后来查了一下objectFieldOffset的真正含义才恍然大悟
Unsafe的objectFieldOffset方法是用于拿到类的属性和类的偏移数值
所以unsafe的数值操作方法也要传this,对于每个实例,value的地址都是this+valueOffset
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
相关文章推荐
- Mongodb总结3-稍微封装一下
- 51nod 1661 黑板上的游戏(yjq魔改ver【x【博弈,稍微数学推一下
- 稍微谈一下 javascript 开发中的 MVC 模式
- 51内核单片机实现CRC-8校验,同样适用于51内核的其他芯片(只要稍微修改一下PIC芯片同样适用)
- 今天稍微学些了一下句柄,记录一下~
- Tensorflow学习精要版IV ---- 开始稍微深入了解一下
- 稍微停顿,在思考一下。
- 稍微思考了一下……
- 转载自网上的即时通讯 稍微修改了一下bug
- Mongodb总结3-稍微封装一下
- 国内的IT生意还真TMD难做,想生存发展大家还得多思考一下,出路在哪里?稍微迷茫了一点点
- 在软件工程里面,我们知道这些知识点吗?我稍微整理了一下!
- 稍微改进了一下,下一步应该是封装对象,然后尝试组件话一个东东~?
- DWR入门教程(代码要稍微调整一下才能用)
- Mongodb总结3-稍微封装一下
- 稍微记录一下最近弄物联网服务器的小心得
- 稍微谈一下 javascript 开发中的 MVC 模式
- 毕竟是百年校庆,稍微宣传一下
- 国内的IT生意还真TMD难做,想生存发展大家还得多思考一下,出路在哪里?稍微迷茫了一点点
- 終於可以稍微輕松一下了