yohhoyの日記

技術的メモをしていきたい日記

Initialization On Demand Holder idiom

プログラミング言語Javaにおけるスレッドセーフなシングルトン遅延初期化イディオム。Double-checked lockingイディオムと異なり*1、厳格なメモリモデルが定義されないJava 1.4以前でも正しく動作する事が保証されている。

public class Foo {
  private Foo() {}
  private static class LazyHolder {
    private static final Foo INSTANCE = new Foo();
  }
  public static Foo getInstance() {
    return LazyHolder.INSTANCE;
  }
}

この表現法は、(例えば静的初期化子(static initializers)など)クラス初期化の一部としての操作は、そのクラスを使う全てのスレッドから見える事が保証されているという事実からスレッド・セーフを確保しており、あるスレッドがそのフィールドやメソッドの一つを参照するまで内部クラスはロードされないという事実から遅延初期化(lazy initialization)を確保しています。

Javaの理論と実践: Javaメモリ・モデルを修正する 第2回

関連URL