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を使用しています。
注: 私は揮発性として停止を宣言する必要があります知っています。しかし、私は上記の場合の行動の理由を知りたいと思います。
:
は例えば、
PrintStream.println
実装を見てみましょう。 :)。 – Elltz私が考えることができる理由の1つは、++がJavaバイトコードに変換され、System.out.printlnが実際にI/OとしてI/Oを使用しないということです。これはブール変数の変化を見るのに十分な時間を与えるかもしれません – shazin