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. シングルトンオブジェクトのインスタンスを複数作らない