Java 易失性写入=易失性读取

Java 易失性写入=易失性读取,java,multithreading,concurrency,volatile,happens-before,Java,Multithreading,Concurrency,Volatile,Happens Before,我以前见过类似于fld=fld的东西几次,但在所有这些情况下,可以消除伪写,并获得更好的性能 public class Tst{ public volatile int fld = 1; public void m(){ //... Something fld = fld; //... Something else } } 问题是,这种伪写是否有它的用例,或者这是一种变通方法?对我来说,这似乎与(因为没有存储和加载可以

我以前见过类似于
fld=fld
的东西几次,但在所有这些情况下,可以消除伪写,并获得更好的性能

public class Tst{
    public volatile int fld = 1;

    public void m(){
         //... Something
        fld = fld;
        //... Something else
    }
}
问题是,这种伪写是否有它的用例,或者这是一种变通方法?对我来说,这似乎与(因为没有存储和加载可以根据JMM在虚拟写入中重新排序)


你的虚拟写入被破坏了,一个易失性写入肯定会在一个易失性读取之前发生,在你的“模式”中,你正在做相反的事情,因此可以进行重新排序


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

除了
Unsafe
之外,它是一个内部API(尽管现在您也有一个公共的替代方案)
public class Tst{
    public volatile int fld = 1;
    private static final Unsafe U;

    public void m(){
         //... Something
        U.fullFence();
        //... Something else
    }
}