2016-05-09 11 views
2

私は揮発性のためのユースケースを通過して、私は以下のシナリオが発生した:マルチスレッドは、「予測不可能」行動

private static boolean stop = false; 
public static void main(String[] args) throws InterruptedException { 
    Thread runner = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      int i = 0; 
      long start = System.currentTimeMillis(); 
      while(!stop){ 
       i++; 
      } 
      System.out.println("I m done after "+(System.currentTimeMillis() - start)); 
     } 
    }); 

    runner.start(); 
    Thread.sleep(2000); 
    stop = true; 
} 

上記のコードの実行を無期限に。 ホイストがコードを最適化するためにコンパイラによって行われたために問題ありません。しかし、私が置き換えた場合、i ++と他の記述があります。 System.out.println( "こんにちは")。 2秒後に停止します。

なぜこのような動作ですか?私はjdk1.7.0_51を使用しています。

注: 私は揮発性として停止を宣言する必要があります知っています。しかし、私は上記の場合の行動の理由を知りたいと思います。

+0

は例えば、PrintStream.println実装を見てみましょう。 :)。 – Elltz

+0

私が考えることができる理由の1つは、++がJavaバイトコードに変換され、System.out.printlnが実際にI/OとしてI/Oを使用しないということです。これはブール変数の変化を見るのに十分な時間を与えるかもしれません – shazin

答えて

0

標準出力はスレッド間の共有リソースです。 JavaのPrintStreamクラスは同期ブロックを使用してスレッドセーフであり、すべての同期ブロックはJavaのメモリバリアです。しかし、これに頼るべきではありません。値のストリーミングを書くよりも簡単である増加し、ビューのラメの点から

public void println(String paramString) 
{ 
    synchronized (this) 
    { 
    print(paramString); 
    newLine(); 
    } 
} 
関連する問題