最近再次翻netty和disrupt的源码, 发现一些地方使用AtomicXXX.lazySet()/unsafe.putOrderedXXX系列, 以前一直没有注意lazySet这个方法, 仔细研究一下发现很有意思。我们拿AtomicReferenceFieldUpdater的set()和lazySet()作比较, 其他AtomicXXX类和这个类似。public void set(T obj, V newValue) {
// ...
unsafe.putObjectVolatile(obj, offset, newValue);
}
public void lazySet(T obj, V newValue) {
// ...
unsafe.putOrderedObject(obj, offset, newValue);
}1.首先set()是对volatile变量的一个写操作, 我们知道volatile的write为了保证对其他线程的可见性会追加以下两个Fence(内存屏障)1)StoreStore // 在intel cpu中, 不存在[写写]重排序, 这个可以直接省略了2)StoreLoad // 这个是所有内存屏障里最耗性能的注: 内存屏障相关参考Doug Lea大大的cookbook (http://g.oswego.edu/dl/
...
继续阅读
(25)