設計モードの一例モード(Java)

12611 ワード

シングルモード
問題
マルチスレッド操作は同一のオブジェクトの整合性を保証します。
考えをまとめる
一度の例示的なプロセスだけが、例示的なオブジェクトを生成し、オブジェクトを返す方法を提供します。
一例モードの分類
1餓漢式
クラスをロードするときにインスタンスオブジェクトが生成されます。
public class HungerySingleton {

    /**
     *             
     */
    private static HungerySingleton instance = new HungerySingleton();

    private HungerySingleton(){

    }
    /**
     * @return       
     */
    public static HungerySingleton getInstance(){
        return instance;
    }
}
スレッドの安全性:ロード時に既に実装されていますので、一度だけ実装されています。スレッドは安全です。
怠惰なロードではありません
性能が悪い
2怠け者タイプ
クラスを読み込み中にインスタンスオブジェクトを宣言しないと、オブジェクトを使用した場合にのみインスタンス化されますが、オブジェクトは一度だけ実装されます。
public class HoonSinglenton {
    /**
     *                  
     */
    private static HoonSinglenton instance = null;
    private HoonSinglenton(){

    }
    /**
     * @return       
     */
    public static HoonSinglenton getInstance(){
        if (instance == null){
            instance = new HoonSinglenton();
        }
        return instance;
    }
}
*スレッドの安全性:安全ではないので、インスタンスオブジェクトの一意性は保証されません。*マルチスレッドアクセス時に、2つのスレッドが同時にifに入ると判断されると、この2つのスレッドが取得したオブジェクトは同一オブジェクトではなく、単例モードの定義には合致しない。
ローディングです
性能がよい
3怠け者タイプ+同期方法
public class HoonSynSinglenton {

    private static HoonSynSinglenton instance = null;
    private HoonSynSinglenton(){

    }

    public synchronized static HoonSynSinglenton getInstance(){
        if (instance == null){
            instance = new HoonSynSinglenton();
        }
        return instance;
    }
}
スレッドの安全性:安全性
ローディングです
パフォーマンスが良くない:synchronized修飾の方法はマルチスレッドアクセス時にシリアルに退化して実行されます。
4 DCL(Double-Cocking)
public class DCL {

    private static DCL instance = null;
    private DCL(){

    }

    public synchronized static DCL getInstance(){
        if (instance == null){
            synchronized(DCL.class){
                if (instance == null){
                    instance = new DCL();
                }
            }
        }
        return instance;
    }
}
性能がいいです
ローディング
スレッドの安全性を保証する
短所:コマンドの並べ替えで空のポインターが異常になります。
5 volatile+DCL
private volatile static DCL instance = null;
DCLソリューション
6 Holder
比較的広い一例モードを使用します。
ステートメントクラスでは、メンバー変数はインスタンス変数を宣言しないで、内部の静的なクラスに入れて、静的なクラスでの実装は、怠け者式にロックをかける問題を回避します。
public class HolderSinglenton {
    
    private HolderSinglenton(){}
    
    private static class Holder{
        private static HolderSinglenton instance = new HolderSinglenton();
    }
    
    public static HolderSinglenton getInstance(){
        return Holder.instance;
    }
}
7列挙
Effective Javaはこの方法を紹介します。
public class EnumSingletonDemo {

    private EnumSingletonDemo(){}

    private enum EnumHolder{
        /**
         *     
         */
        INSTANCE;
        private EnumSingletonDemo instance;
        EnumHolder(){
            this.instance = new EnumSingletonDemo();
        }
        private EnumSingletonDemo getInstance(){
            return instance;
        }
    }
    
    public static EnumSingletonDemo getInstance(){
        return EnumHolder.INSTANCE.getInstance();
    }
}
コードのエニュメレート・タイプは内部クラスで、内部クラスはJavaで使用されています。EnumSingleton Demo類をロードすると内部クラスの負荷を引き起こしません。