之前我曾见过类似fld = fld
的内容,但在所有这些情况下,可以通过更好的性能消除虚拟写入。
public class Tst{
public volatile int fld = 1;
public void m(){
//... Something
fld = fld;
//... Something else
}
}
问题是这样的虚拟写入是否有其用例或这是一些解决方法?对我来说,这看起来完全一样(因为根据JMM,没有可以在虚拟写入中重新排序存储和加载)
public class Tst{
public volatile int fld = 1;
private static final Unsafe U;
public void m(){
//... Something
U.fullFence();
//... Something else
}
}
答案 0 :(得分:1)
您的虚拟写入被破坏,保证在易失性读取之前发生易失性写入,在您的"模式中#34;你正在做相反的事情,所以可能会发生重新排序。
fullFence
保证不会重新排序,但不应该使用它。