このコードでは:
public class PossibleReordering {
static int x = 0, y = 0;
static int a = 0, b = 0;
public static void main(String[] args)
throws InterruptedException {
Thread one = new Thread(new Runnable() {
public void run() {
a = 1;
x = b;
}
});
Thread other = new Thread(new Runnable() {
public void run() {
b = 1;
y = a;
}
});
one.start(); other.start();
one.join(); other.join();
System.out.println("( "+ x + "," + y + ")");
}
}
Java Compiler は、実行を最適化するためにスレッド 1 とスレッド 2 の命令を並べ替え、最終的に結果 (0,0) を発生させると言われています。
また
、スレッド内の各アクションは、そのスレッド内のプログラム順序で後から来るすべてのアクションの前に発生します。
これらの 2 つのステートメントは互いに矛盾しますか?