LoginSignup
8
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-18

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

8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11