3

次の単純な Java プログラムを見てください。

import java.lang.*;

class A {
    static boolean done;
    public static void main(String args[]) {
        done = false;
        new Thread() {
            public void run() {
            try {
                Thread.sleep(1000); // dummy work load
            } catch (Exception e) {
                done = true;
            }
            done = true;
            }
        }.start();
        while (!done);
        System.out.println("bye");
    }
}

あるマシンでは、「さようなら」と出力してすぐに終了しますが、別のマシンでは何も出力せず、永遠にそこにとどまります。なんで?

4

2 に答える 2

8

これは、あなたbooleanが ではないvolatileためです。したがって、 はそのThreadコピーをキャッシュすることが許可されており、それらを更新することはありません。- をお勧めしAtomicBooleanます。これにより、発生する可能性のある問題を防ぐことができます。

public static void main(String args[]) {
    final AtomicBoolean done = new AtomicBoolean(false);
    new Thread() {
        public void run() {
            done.set(true);
        }
    }.start();
    while (!done.get());
    System.out.println("bye");
}
于 2013-04-01T22:55:32.060 に答える
0

メイン プログラムの while ループ (スレッドでもあります) に到達するまでに、新しいスレッドは、done フラグが true に設定されている run() を終了している可能性があります。これを確認するために、done が true に設定される前に run() にスリープを追加し、別のマシンにも bye が表示されるかどうかを確認できます。これが役立つことを願っています。

于 2013-04-01T22:58:03.750 に答える