「ヘッドファーストデザインパターン」の研究ノート - シングルトン

今日の用語シングルトンパターンは、デザインパターンは比較的単純なクラス構造で、実際には、彼は唯一の1つのクラスを持っていました。ハッハッハ、我々はそれを見に行くされていること。

public class Singleton {
    private static Singleton uniqueInstance;
    
    private Singleton() {}

    public static Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

最初のコンストラクタ民営化に続いて、このクラスの民営化のプロパティが定義されている、唯一のこのクラスのコンストラクタを呼び出す、以下がフォーカスされている、のgetInstanceスルー()メソッドは、このクラス・オブジェクト・クラスの外得ることができ、最初にこのクラス属性uniqueInstanceは、このプロパティは、我々は1つのオブジェクトのみを持っていることを保証するために、プロパティのインスタンスは空である、または直接リターン場合、判決です​​。

シングルトンは、クラスのインスタンスを1つだけ確実に、そしてグローバルなアクセスポイントを提供します。

getInstance()メソッドは、我々は、このクラスのインスタンス化を遅らせることができる場合、このuniqueInstanceクラスのプロパティは、オブジェクトのこのクラスの唯一のインスタンスである、最初の時間は、最初のコールのgetInstance()メソッドでこのオブジェクトを使用しますクラスは、プロパティを直接返すときuniqueInstanceは後に、その後、インスタンス化します。

このコードは非の打ちどころのないではありません。しかし、マルチスレッドと、このコードを使用する場合は、単に災害で、今は解決する方法を見て:

public class SingletonThread {
    private static SingletonThread uniqueInstance;
    
    private SingletonThread() {}
    
    public static synchronized SingletonThread getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new SingletonThread();
        }
        return uniqueInstance;
    }
}

すなわち、方法のうちの他のスレッドまで待機するには、この方法に入る前に、各スレッドを強制的に、のgetInstance()メソッドに同期キーワードを増加させることによって、です。しかし、これは最初の同期のパフォーマンスが低下する可能性があり、あなたが同期を設定する必要がある場合、すべての時刻同期が過剰の背後にあるようuniqueInstanceアップセットは、同期する必要はありません一度第二に、我々は、この属性の最初のインスタンスのみを持って、まだ問題があります手順。

我々はうまくにロードすることができますので、このクラスは、JVMでインスタンス化された作品は、次のコードを見ているとき:

public class SingletonFirst {
    private static SingletonFirst uniqueInstance = new SingletonFirst();
    
    private SingletonFirst() {}
    
    public static SingletonFirst getInstance() {
        return uniqueInstance;
    }
}

我々はJVMにクラスをロードしたときは、すぐに独自のシングルトンインスタンスを作成することができます。あなたはまず、静的変数にアクセスするために、任意のスレッド前に、JVMの保証のインスタンスを作成します。

次のように同期のgetInstance()の使用を減少させる「ダブルチェック・ロック」を使用する別の方法は、コードは次のとおりです。

public class SingletonDouble {
    private volatile static SingletonDouble uniqueInstance;
    
    private SingletonDouble() {}
    
    public static SingletonDouble getInstance() {
        if (uniqueInstance == null) {
            synchronized (SingletonDouble.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new SingletonDouble();
                }
            }
        }
        return uniqueInstance;
    }
}

この方法では、我々は非常にそれは、注意、ブロック同期コードを作成しない場合は、再度、インスタンスをチェックし、同期ブロックを入力して、例を確認し、そうでない場合はまず、時間消費量を減らすことができ、我々は最初、一回実行されます同期の前回。メカニズムは、バージョン1.4およびそれ以前には適用されませんロックダブル-確認しました。

まあ、すべてのシングルトンパターンの実装が完了しているだろう、それを取ることを忘れないでください。

公開された26元の記事 ウォンの賞賛2 ビュー2328

おすすめ

転載: blog.csdn.net/qq_42909545/article/details/104895625