ダブルチェックロックを報告します。

ダブルチェックロックは同期コストを避けながら、オンデマンドかつスレッドセーフな方法でフィールドを初期化しようとします。 残念ながら、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;
      }
  }