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
}
}