共有メモリ

クラスタとかならともかく、単なるデュアルコア程度ではこういう現象は起こらないと何となく思っていた。

$ 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

この発生率のバグに出くわしたら泣ける。