Think Twice
IT技術メモ | Javaのメモ
Created: 2008-04-10 / Updated: 2022-11-06

Javaでシングルトンを実現するならInitialize-On-Demand Holderイディオムを使うといいらしい


当メモは2008-04-10に投稿されたものを加筆修正し、再掲したものです。

目次


概要

こちらはシングルトンを実装するための方法についてメモしたものになりますが、古い内容となっています。
最近だと、Javaでenumを使ってシングルトンを素早く実装するを見てもらったほうがいいかもしれません。2022-11-06 更新

Initialize-On-Demand Holder

忘れないようにメモ。

Javaでシングルトンを実現しようとする際のクラス生成イディオム。
double-checked locking問題をすっぱりと解決したもので、スレッドセーフな上に高速であり、混乱も少ないのが特徴。 簡単!安全!すっきりキレイ!

Copy
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()呼び出し時に、プライベートインナークラスのHolderinstanceに最初にアクセスしたタイミングで、Singletonのインスタンスが唯一生成される。
このタイミングは排他されるんで、synchronizedしなくてもよい。ってな具合です。


参考

元記事

関連メモ

参考記事

より学ぶために