[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 12432] Re: SharedCounter の実験 (1) - 再送



村山です.

> >   徹さんのサンプルを
> >     CPU(AMD Opteron 244) x 2, WindowsXP(x64 Edition), J2SE 5.0 Update6(ServerVM)
> > で起動したのですが、なぜか終了せずにインクリメントし続けるみたいです...

> どちらの環境でも、-serverオプションを指定してHotSpot Server VMで実行すると
> interrupt()に反応しないですね。うむ?
> 
> jconsoleコマンドで実行中のSharedCounterIncrementorに接続してみると、
> Thread-0、Thread-1ともにrunメソッドの中で活動中のようです。
> 
> -XintオプションでHotSpotコンパイラを無効にすると終了するようになります。
> また、runメソッド中でSystem.out.print('.');のようなスケジューリングを
> 発生させるようなI/Oを発生させると終了します。
> 
> HotSpot Server VMの問題かもしれません。

「正しく」最適化された結果じゃないでしょうか?

volatile変数もsynchronizedメソッドも使っていない場合は,
他スレッドの影響を無視することが許されるし,実行順序も変更できますよね.

while (true) {
  counter++;
  numIncremented++;
  if (Thread.currentThread().isInterrupted()) {
    System.out.printf("I have incremented %d times%n",
                      numIncremented);
    return;
  }
}
は
if( Thread.currentThread().isInterrupted() ) {
  while (true) {  //  実はここも不要になる.
    counter++;
    numIncremented++;
    //if (true )
    System.out.printf("I have incremented %d times%n",
                      numIncremented);
    return;
  }
}
else{
  while (true) {  // 無限ループに入って終わらない.
    counter++;
    numIncremented++;
  }
}

みたいな最適化が許されるわけですよね.

本来このプログラム自体が意図的にバグを埋め込んだプログラムなので,
最適化によっては終了しなくなることもありえると思います.

-- 
murayama <locutus@xxxxxxxxxxxxxxxx>