易失性写入是否确保在一个线程中发生的任何写入(非易失性/易失性写入)对其他线程都是可见的?
以下给定代码是否总是90,80
作为输出产生?
public class MyClass
{
private boolean flag = false;
private volatile int volatileInt = 0;
private int nonVolatileInt = 0;
public void initVariables()
{
nonVolatileInt = 90; // non-volatile write
volatileInt = 80; // volatile write
flag = true; // non-volatile write
}
public void readVariables()
{
while (flag == false)
{}
System.out.println(nonVolatileInt + ","+ volatileInt);
}
public static void main(String st[])
{
final MyClass myClass = new MyClass();
Thread writer = new Thread( new Runnable()
{
public void run()
{
myClass.initVariables();
}
});
Thread reader = new Thread ( new Runnable()
{
public void run()
{
myClass.readVariables();
}
});
reader.start();writer.start();
}
}
我关心的是方法 initVariables()。JVM是否可以自由地以下列方式重新排序代码块?:
flag = true;
nonVolatileInt = 90 ;
volatileInt = 80;
因此,我们得到阅读器线程的输出为: 0,0
或者,它们可以按以下方式重新排序:
nonVolatieInt = 90;
flag = true;
volatileInt = 80;
因此,我们得到阅读器线程的输出:90,0