デザインパターン - 実現のスキーマを作成するために、5種類のシングルトンパターン

Singletonパターン(シングルトン)

でシングルトンGOF比較的単純な、以下の説明を参照Baiduの百科事典23のデザインパターン:

シングルトン、それは一般的なソフトウェアのデザインパターンです。そのコア構造ではシングルトンと呼ばれる特殊なクラスが含まれています。単一モードシステムの実施形態は、1つのインスタンスのみアプリケーションクラスモデルのクラスを保証します。すなわち、クラスが一つだけのオブジェクトのインスタンスを持っています

何度もシステム全体が唯一のグローバルオブジェクトを持っている必要があり、これは、私たちはシステムの全体的な動作を調整するのに役立ちます。シングルトンオブジェクトを介して再取得サービス構成情報の過程において、例えば、サーバプログラムは、サーバ構成情報は、ファイルに格納されたコンフィギュレーションデータは、シングルトンオブジェクトの結束によって読み取られ、その後、他のオブジェクト。このアプローチは、複雑な環境における構成管理を簡素化します。

Javaでは、クラスは、オブジェクトのインスタンスが1つだけの権限を変更することによって達成することができたことを確認してください。

Singletonパターン - パターン飢え

グローバルモードのシングルトンインスタンスを飢えシングルトンが初めて使用される構築物を意味します。
特定の実装:

  // 单例模式的饿汉模式实现
  public class Singleton {
    private final static Singleton SINGLETON= new Singleton();
    // Private constructor suppresses   
    private Singleton() {}
 
    // default public constructor
    public static Singleton getInstance() {
        return SINGLETON;
    }
  }

モードの実装を飢えでは、プログラムの主な機能は次のとおりです:

  1. プライベート工法
  2. 自分の例を保護するプライベート静的プロパティ、
  3. 静的サービスメソッドは、例を取得します
  4. 作成するための初期化時には、システムリソースの消費を初期化します

シングルトン - 怠惰なモード - ノーマル

レイジーモード、最も一般的な形式は、飢えた男モードは、時には資源を節約するために、初期化時に負荷にプログラムすることができ、我々は怠惰なモードを使用することができ、必要なときにロードされるように、この時間を必要とします。
特定の実装:

public class SingletonLayload { 
    // 私有化自身类对象
    private static SingletonLayload SINGLETON;
    // 私有化构造方法
    private SingletonLayload() {}
    
    // 静态方法获取实例
    public static SingletonLayload getInstance() {
        if(SINGLETON== null ) {
            SINGLETON= new SingletonLayload();
        }
        return SINGLETON;
    }
}

シングルトン - 怠惰なモード - ゲンロック

マルチスレッド環境では、単純な単一モードの実施形態の意志の問題、上記の想像レイジー・モードでは、マルチスレッド実行であればgetInstance()、スレッドAが実行さに、:

INSTANCE = new SingletonLayload();

まだ終了していない場合、スレッドBを実行しif(INSTANCE == null )、その後、単一ケースの特性を保証することはできません。
そのため、マルチスレッド環境では、シングルトンモードでは、真のシングルトンを確実にするために、同期ロックを必要とします。
特定の実装:

public class SingletonLayloadSyn {
    // 私有化自身类对象
    private static SingletonLayloadSyn SINGLETON;
    // 私有化构造方法
    private SingletonLayloadSyn() {}
    // 静态方法获取实例
    public static synchronized SingletonLayloadSyn getInstance() {
        if(SINGLETON == null ) {
            SINGLETON = new SingletonLayloadSyn();
        }
        return SINGLETON;
    }

}

getInstance()方法の追加synchronized複数のスレッドによって引き起こされる問題を解決することができますキーワードを。

シングルトン - 怠惰なモード - ダブルチェックロック

あなたはマルチスレッドスレッドセーフの目的を達成することができますが、問題を解決しますが、使用中の方法上記( - -怠惰なモード同期ロックマルチスレッド)を使用して、synchronized次のキーワードをいくつか呼び出したときに、コード効率が大幅ます減少しました。そして、それは考慮に効率を取ることができ、同時にスレッドセーフでは方法がありませんか?
特定の実装:

public class SingletonLayLoadSynDCL {
    // 私有化自身类对象
    private static SingletonLayLoadSynDCL SINGLETON;
    // 私有化构造方法
    private SingletonLayLoadSynDCL() {
    }

    public static  SingletonLayLoadSynDCL getInstance() {
        if (SINGLETON == null) {
            synchronized(SingletonLayLoadSynDCL.class) {
                SINGLETON = new SingletonLayLoadSynDCL();
            }
        }
        return SINGLETON;
    }
}

使用synchronizedスレッドセーフ、シングルトンがされnull、インスタンスが作成されたときに行われるが、インスタンスが作成されていないときに、新しいスレッドが実行するという保証はまだありませんif (SINGLETON == null)ので、まだ安全ではありません。
修正getInstance()方法。
特定の実装:

public class SingletonLayLoadSynDCL {
    // 私有化自身类对象
    private static SingletonLayLoadSynDCL SINGLETON;
    // 私有化构造方法
    private SingletonLayLoadSynDCL() {
    }
    
    // 使用双重校验锁确保线程安全的同时兼顾执行效率
    public static SingletonLayLoadSynDCL getInstance() {
        if (SINGLETON == null) { // 第一重检查
            synchronized (SingletonLayLoadSynDCL.class) {
                if (SINGLETON == null) { //第二重检查
                    SINGLETON = new SingletonLayLoadSynDCL();
                }
            }
        }
        return SINGLETON;

    }
}

一見完璧なダブルチェックモードは、理論的には問題はありません。しかし、実際の状況では、完成工事シングルトン判例引用が存在しない場合に発生する可能性がNULLがない、実行する他のスレッドがある場合は、この時間は、if (SINGLETON == null) { // 第一重检查間違ったシングルトンの参照を取得します。これはのためにあるJVMの書き込みによって引き起こされる障害。

幸い、JDK1.5提供後にvolatile読んで変数を制御することが許可されていないことを保証するように変更する書き込みを行うためのキーを。上方修正さこうして具体。

/**
 * <p>
 * 使用双重校验锁以及volatile关键字确保线程安全的同时兼顾执行效率
 * @author  niujinpeng
 */
public class SingletonLayLoadSynDCL {
    // 私有化自身类对象
    //  private static SingletonLayLoadSynDCL SINGLETON;
    private volatile static SingletonLayLoadSynDCL SINGLETON;
    // 私有化构造方法
    private SingletonLayLoadSynDCL() {}

    // 使用双重校验锁确保线程安全的同时兼顾执行效率
    public static SingletonLayLoadSynDCL getInstance() {
        if (SINGLETON == null) {
            synchronized (SingletonLayLoadSynDCL.class) {
                if (SINGLETON == null) {
                    SINGLETON = new SingletonLayLoadSynDCL();
                }
            }
        }
        return SINGLETON;

    }
}

シングルトン - 怠惰なモード - 内部クラス

マルチスレッドの問題を解決するよりも、怠惰な方法を達成するために、上記のモデルを使用することに加えて、「効果的なJavaは、」著者は考慮に達成するために、静的な内部クラスとクラスのロード特性を利用し、安全かつ効率的な方法の撮影を確保する別のスレッドを提供します。静的な内部クラスは一度だけ、負荷および負荷と負荷の初期化クラスを呼び出すときにロードし、クラスの静的プロパティされていません。こうして取得されたインスタンスの一意性を保証します。
特定の実装:

package cn.snowflow.pattern.singleton;
/**
 * <p>
 * 利用静态内部类实现线程安全且兼顾效率的单例模式
 * @author  niujinpeng
 */
public class SingletonLayloadSynSafe {
    //静态内部类
    public static class SingletonHolder{
        static final SingletonLayloadSynSafe INSTANCE = 
            new SingletonLayloadSynSafe();
    }
    // 私有化构造方法
    private SingletonLayloadSynSafe() {}
    
    // 公有方法获取实例
    public static SingletonLayloadSynSafe getInstance() {
        return SingletonHolder.INSTANCE;
    }

}

あなたはSingletonパターンを使用している場合-飢えモードが推奨されます【单例模式 - 饿汉模式】
あなたはシングルトン使用している場合-怠惰なモードをお勧めします【单例模式 - 懒汉模式 - 内部类 】

<終了>

ウェブサイト:https://www.codingme.net
あなたがこの記事を楽しんでいる場合は、一緒に成長、公共の数を集中することができます。
ノー世間の注目は、Java拾う&インタビューデータのネットワーク全体最もホットなコア知識のリソースへのアクセスルーチンに応答することはできません。

おすすめ

転載: www.cnblogs.com/niumoo/p/11818047.html