いくつかの単例モードの書き方

1523 ワード

方法1:
public class Singleton1 {
    private Singleton1(){
        System.out.print("Singleton1 created");
    }
    private static Singleton1 instance = new Singleton1();
    public static Singleton1 getInstance(){
        return instance;
    }
    public static void createString(){
        System.out.print("String created");
    }
}

Singletonを使用すると.createString()の実行結果は次のとおりです.
Singleton created
String created

単例クラスは使用されていませんが、ロードされました.この問題を解決するために私たちは方法2を導入した.
方法2:
public class Singleton2 {
    private Singleton2(){
        System.out.print("Singleton2 created");
    }
    private static Singleton2 instance = null;
    public static sychronized Singleton2 getInstance(){
        if (install == null){
            instance = new Singleton2();
        }
        return instance;
    }
}

第2の方法は同期キーワードを用いて遅延ロード機能を実現したが、同期キーワードはsychronizedによって修飾されたコードに複数のスレッド同僚がアクセスすることを許さないため、マルチスレッドのプロジェクトでは方法1に及ばないことが予想される(ここでは自分で検証できる).
方法3:
public class Singleton3 {
    private Singleton(){
        System.out.print("Singleton3 created");
    }
    private static class SingletonHolder {
        private static Singleton3 instance = new Singleton3();
    }
    public static Singleton3 getInstance() {
        return SingletonHolder.instance;
    }
}

Singleton 3では、Singleton 3がロードされると内部クラスはロードされず、getInstanceメソッドが呼び出されるとSingletonHolderクラスがロードされ、遅延ロードの機能が保証される内部クラスが使用される.