3

このコードでは:

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 つのステートメントは互いに矛盾しますか?

4

1 に答える 1

3

先行発生規則は、相互に依存するステートメントにのみ適用されます。これらのrun()メソッドにはどちらも独立した割り当てが含まれているため、コンパイラはそれらを並べ替えることができ、記述した出力が発生する可能性があります。ここでJavaspecs
の定義を読むことができます: happens-before

2 つのアクション間に事前発生関係が存在するからといって、必ずしも実装でその順序で実行する必要があるとは限らないことに注意してください。並べ替えが合法的な実行と一致する結果をもたらす場合、それは違法ではありません。

たとえば、最初のrun()メソッドが次のようになっているとします。

public void run() {
    b = 1;
    x = b;
}

再注文は許可されません。

于 2012-09-14T04:57:25.410 に答える