Javaでシングルトンパターンを実装するには
Javaでは、シングルトンパターンは次の2つの方法で実装できます。
- 遅延初期化によるシングルトンパターン
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
インスタンスは初回のgetInstance()メソッド呼び出し時に初めて作成されるため、これを遅延生成と呼ぶ。しかしながらマルチスレッド環境では、複数のスレッドが同時にinstance==nullの判定に入り、複数のインスタンスが生成される問題がある。
getInstance()メソッドを排他制御することで、マルチスレッドの問題を解決できます。
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
しかしこのやり方では getInstance()メソッドが呼び出されるたびにロック操作が必要となり、パフォーマンスが低下する。
- 即時初期化シングルパターン(イージア イニシャライゼーション)
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
アプリケーション起動時にインスタンスを作成するため、この手法を「餓漢」と呼びます。この方法はマルチスレッド下でも安全ですが、アプリケーションのライフサイクルを通してインスタンスがほとんど使用されない場合、メモリの無駄遣いになります。