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

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