2

Niko の Java ブログから

これらのクラスは、同じファイルで定義されています。出力は何ですか?(正解は1つ)

class Job extends Thread {
    private Integer number = 0;
    public void run() {
        for (int i = 1; i < 1000000; i++) {
            number++;
        }
    }
    public Integer getNumber() {
        return number;
    }
}
public class Test {
    public static void main(String[] args) 
    throws InterruptedException {
        Job thread = new Job();
        thread.start();
        synchronized (thread) {
            thread.wait();
        }
        System.out.println(thread.getNumber());
    }
}
  • 0 を出力します。
  • 999999 と表示されます。
  • 出力が上記のいずれかになることは保証されません。

出力は999999です。run()スレッドがそのメソッドを完了すると終了し、スレッドが持っていたすべてのロックが解放されることを理解しています。ただし、この演習では Thread オブジェクトをロックとして使用していますが、これは通常のオブジェクトと見なすべきではないでしょうか。threadスレッドではなくメインスレッドが所有するロックを意味します。

4

1 に答える 1

5

このコードは、Java 7 より前には文書化されていなかった実装の詳細に依存しており、現在は (メソッドの文書化でjoin()) 文書化されていますが、次の言葉が含まれています。

スレッドが終了すると、 this.notifyAll メソッドが呼び出されます。アプリケーションが Thread インスタンスで wait、notify、または notifyAll を使用しないことをお勧めします。

したがって、この質問がどこで尋ねられたのかはわかりませんが、スレッドの隠れたコーナーケースを知っているかどうかを実際にテストします。これは、正常なプログラムでは決して使用しないでください。

于 2013-06-02T18:47:32.973 に答える