Java実装Singletonパターンとの違い

悪役シングルトンパターン:
/ *

  • 悪人は問題ありませんので、マルチスレッドとスレッドセーフの場合には、オブジェクトを初期化するための時間を考えるためのスペースを持つシングルトンパターン、。

    • @author管理者
    • * /
      publicクラスWickedManSingleTon {

    プライベート静的WickedManSingleTonインスタンス=新しいWickedManSingleTon();

    プライベートWickedManSingleTon(){

    }

    パブリック静的WickedManSingleTon getIntance(){
    インスタンスを返します。
    }

}

レイジーモード:

/ **

  • シングルアイドラー実施の形態では、スペースの概念のための時間、シングルトンの例は、複数のスレッドの場合、スレッドの安全性の問題が存在します。

    • @author管理者
    • * /
      publicクラスLasyManSingleTon {

    プライベート静的LasyManSingleTonインスタンス= NULL;

    プライベートLasyManSingleTon(){

    }

    パブリック静的LasyManSingleTonのgetInstance(){
    IF(例えば== NULL){
    インスタンス=新しいLasyManSingleTon()。
    }
    インスタンスを返します。
    }

}

/ **

  • ダブル検索はシングルトンを達成します
  • アドバンテージ@author管理者DCLモードは、そのオブジェクトがインスタンスを決定するのは初めてのため、作成するために使用する必要があるだけです==
  • 不要なヌルロック、インスタンスをインスタンス化するための唯一の第1のロードロックを避けるために。これは、メモリ空間を節約するだけでなく、スレッドの安全性を確保できます。しかし、注文による執行機能のJVM、DCLスレッド危険な状況が生じることになります。次のように具体的な分析は次のとおりです。
  • INSTANCE =新しいDCLInstance();
  • このステップでは、実際には、3段階のJVMの実行内側:   
  • オープンヒープメモリ空間1.。  
  • ヒープメモリパラメーター内部シングルトンの例のそれぞれにおいて2。  
  • 3.オブジェクトは、ヒープメモリ空間を指します。
  • なぜならオーダー実行JVM機能の、それが起因3、インスタンスの実行のために、この時間は、スレッドBに切り替えられた場合、最初の3つの上で実行される2で実行しなくてもよいです
  • 非空で、直接実行に使用されますしている、このような場合は、例外があるでしょう。これは有名なDCLの失敗です。
    * /
    パブリッククラスDCLInstance {
    //手書きのデュアル取得
    プライベート静的DCLInstanceインスタンス= NULL; //最適化揮発性を利用して

    プライベートDCLInstance(){

    }

    パブリック静的DCLInstanceのgetInstance(){

    if (instance == null) {
        // 同步操作
        synchronized (DCLInstance.class) {
            if (instance == null) {
                // 多线程环境下可能会出现问题的地方
                instance = new DCLInstance();
            }
        }
    }
    return instance;

    }

}

/ **

  • @author管理者
  • シングルトンパターンを実装内部クラスとして:
  • 利点は、静的な内部クラスです。このクラスは、外部負荷直後に内部クラスをロードする必要はありません、クラスが初期化されていないインスタンス内にロードされていない、それはメモリを考慮していません。
  • これは、のgetInstance()メソッドが最初に呼び出されたときにのみ、シングルトンが最初にロードされたとき、ある、SingleTonHolerをロードする必要はありません
  • 初期化INSTANCEを行くだろう、最初のコールのgetInstance()メソッドは、SingleTonHolerクラスをロードするために仮想マシンを引き起こし
  • このアプローチだけでなく、スレッドセーフではなく、一つのケースの一意性を保証するだけでなく、シングルトンのインスタンス化を遅延させます。
  • * /
    publicクラスInerClassMakeIntance {

    プライベート静的InerClassMakeIntanceインスタンス= NULL;

    プライベートInerClassMakeIntance(){

    }

    パブリック静的InerClassMakeIntanceのgetInstance(){
    InerInstance.t1を返します。
    }

    プライベート静的クラスInerInstance {
    プライベート静的InerClassMakeIntanceさt1 =新しいInerClassMakeIntance()。
    }
    }

おすすめ

転載: blog.51cto.com/13217372/2437525