易失性写入=易失性读取

时间:2018-05-10 15:22:53

标签: java multithreading concurrency volatile happens-before

之前我曾见过类似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
    }
}

1 个答案:

答案 0 :(得分:1)

您的虚拟写入被破坏,保证在易失性读取之前发生易失性写入,在您的"模式中#34;你正在做相反的事情,所以可能会发生重新排序。

fullFence保证不会重新排序,但不应该使用它。