揮発性書き込みは、あるスレッドで他のスレッドに表示される前に、書き込み (不揮発性/揮発性書き込み) が発生することを保証しますか?
次のコードは常に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