Edited at

[Java] シングルトンパターン

More than 1 year has passed since last update.

Javaの学習メモ


シングルトンパターン


基本(シングルスレッドからの使用前提)


SingletonClass.java

package com.company;

public class SingletonClass {
private static SingletonClass instance = new SingletonClass();

private SingletonClass() {}

public static SingletonClass getInstance() {
return instance;
}
}



Main.java

package com.company;

public class Main {
public static void main(String[] args) {
SingletonSample obj = SingletonSample.getInstance();
}
}




  • getter を定義 (C#と違ってプロパティ構文はない)

  • インスタンス生成とコンストラクタは private にする。(C#と同じ)

  • GoF本の定義は古いので注意

  • インスタンスが作られるのはクラスがロードされたときではなく、初めて使われるとき


    • => マルチスレッドから getInstance() が使われる場合にインスタンスが複数作成される可能性がある




マルチスレッド対応

上にも書いたとおり、インスタンスが生成されるのはクラスがロードされたときではなく初めて使われるときのため、getInstance() のマルチスレッドからの呼び出しを許可している場合、インスタンスが複数作成される可能性がある。

対応方法として、以下などが挙げられる。


synchronized修飾子を使用

class Singleton {

static Singleton instance = null;
public static synchronized Singleton getInstace() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}


Initialize-on-Demand_Holder_クラスパターン

class Singleton {

private Singleton(){}

public static Singleton getInstace() {
return SingletonHolder.INSTANCE;
}

private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
}


参考

デザインパターン「Singleton」 - Qiita

MSC07-J. シングルトンオブジェクトのインスタンスを複数作らない


関連

[C#6.0~] シングルトンパターンの実装 - Qiita


参考

JavaのSingletonデザインパターン - Qiita

MSC07-J. シングルトンオブジェクトのインスタンスを複数作らない