2

我以前见过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
    }
}
4

1 回答 1

1

您的虚拟写入已损坏,保证在易失性读取之前发生易失性写入,在您的“模式”中,您正在做相反的事情,因此可能会发生重新排序。

fullFence保证不重新排序,但它不是应该使用的东西。

于 2018-05-10T17:42:37.020 回答