在读 StampedLock源码的时候发现作者加入了一个内存屏障,代码块如下:
@ReservedStackAccess
private long tryAcquireWrite() {
long s, nextState;
// op1:乐观读
// op2: 自旋的将AQS状态改成写状态
if (((s = state) & ABITS) == 0L && casState(s, nextState = s | WBIT)) {
// 插入写屏障?
U.storeStoreFence();
return nextState;
}
return 0L;
}
其中s 是volatile修饰的变量,我们都知道,volatile修饰的变量在编译成指令序列的时候会插入屏障。
而CAS操作是直接修改内存中的值。那么问题如题目。
如果是的话,U.storeStoreFence();的意义何在?
如果不是的话, U.storeStoreFence();在这里的作用是什么?