double checked locking の理解を今頃している

double checked locking が(Javaでは)ダメっていうのを、メモリモデルがどうのという理由でわかってはいたけど、細かいところをちゃんと把握していませんでした。

http://www.ibm.com/developerworks/jp/java/library/j-dcl/index.html

上記の記事を読んでやっとわかった。とりあえず、メモリ領域だけを用意して値を設定しちゃって、その後に初期化をするようなコードになっていると確かにヤバい。Wikipedia によると JDK1.5 のvolatile でなんとかなるみたいだ。

http://en.wikipedia.org/wiki/Double-checked_locking

As of J2SE 5.0, this problem has been fixed. The volatile keyword now ensures that multiple threads handle the singleton instance correctly.

だが、結局そこで同期が発生するから利点が減っていく。Classの初期化時にstatic fieldを初期化してOKなら(初期化時のコストが上がるけど)、そっちのがよいということか。