ダブルチェックロックは同期コストを避けながら、オンデマンドかつスレッドセーフな方法でフィールドを初期化しようとします。
残念ながら、volatile で宣言されていないフィールドで使用される場合はスレッドセーフではありません。
Java 1.4 以前を使用している場合、volatile フィールドを使用していてもダブルチェックロックは機能しません。
この問題の詳細な説明については、上記のリンク先の記事をご覧ください。
正しくないダブルチェックロックの例:
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null) helper = new Helper();
}
return helper;
}
}
// 他の関数とメンバー...
}