共有メモリ
クラスタとかならともかく、単なるデュアルコア程度ではこういう現象は起こらないと何となく思っていた。
$ cat Test.java public class Test { public static void main(String[] args) { for (;;) test(); } static int a, b, x, y; static void test() { try { a = b = 1; Thread t1 = new Thread() { public void run() { a = 2; x = b; } }; Thread t2 = new Thread() { public void run() { b = 2; y = a; } }; t1.start(); t2.start(); t1.join(); t2.join(); if (x == 1 && y == 1) System.exit(0); } catch (InterruptedException e) { } } } $ javac Test.java $ time java Test 4070.06 real 1584.35 user 3679.72 sys
この発生率のバグに出くわしたら泣ける。