No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

シングルトンにInitialize-On-Demand Holder

忘れないようにメモ。

Initialize-On-Demand Holder

Javaでシングルトンを実現しようとする際のクラス生成イディオム。
「いにしゃりぜーしょんおんでまんどほるだー」と読む、多分。
double-checked locking問題をすっぱりと解決したもので、スレッドセーフな上に高速であり、混乱も少ないのが特徴。


簡単!安全!すっきりキレイ!

class Singleton {
    /** インスタンスホルダー */
    private static class Holder {
        public static final Singleton instance = new Singleton();
    };
...
    /** コンストラクタは封印 */
    private Singleton(){};

    /** 唯一のSingletonインスタンスをゲット! */
    public static Singleton getInstance() {
        return Holder.instance;
    } 
}


要するに、Singleton#getInstance()呼び出し時にプライベートインナークラスのHolderのinstanceに最初にアクセスしたタイミングで、Singletonのインスタンスが唯一生成される。このタイミングは排他されるんで、synchronizedしなくてもよい。ってな具合です。