当メモは2008-04-10に投稿されたものを加筆修正し、再掲したものです。
目次
概要
こちらはシングルトンを実装するための方法についてメモしたものになりますが、古い内容となっています。
最近だと、Javaでenumを使ってシングルトンを素早く実装するを見てもらったほうがいいかもしれません。2022-11-06 更新
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
しなくてもよい。ってな具合です。