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