2012-03-26 6 views
5

私はC03「の練習でJavaの同時実行」を読んだとき、私は以下のプログラムで混乱していた。そのため、並べ替えやスレッドの可視性のJavaスレッドの可視性

public class NoVisibility { 
    private static boolean ready; 
    private static int number; 

    private static class ReaderThread extends Thread { 
     public void run() { 
      while (!ready) 
       Thread.yield(); 
      System.out.println(number); 
     } 
    } 

    public static void main(String[] args) { 
     new ReaderThread().start(); 
     number = 42; 
     ready = true; 
    } 
} 

に、ループは停止しないかもしれない、または出力はゼロかもしれませんが、何度も試してみましたが、出力は常に42です。 すべての理由は私があまりにもラッキーですか?

+1

この質問は[this one](http://stackoverflow.com/questions/1919469/question-about-java-concurrency-in-practice-example)とまったく同じです。 – xea

答えて

9

すべての理由は私はあまりにもラッキーですか?

必ずしもそうである必要はありません。それはあなたのプロセッサアーキテクチャとJVMの実装にも依存します。それは、微妙なメモリモデルの問題に関する問題の1つです。野生の中で再現するのが非常に難しい場合があります。

+0

OK、わかりました。ありがとうございます –

+0

私は理解していません。 numberが42に設定される前に、カムの準備ができていますか?つまり、他のスレッドがスレッドを変更していない場合です。 – Burkhard

+1

@Burkhard:別のポストボックスに同じ人に2文字を投稿するとします。 2番目に投稿されたものは、最初に投稿されたものよりも先に受信者に実際に届くことがあります。スレッド間のメモリの可視性についても同じことが言えます。 –