JAva設計モード(単例モード)の性能と思想

3147 ワード

単一モード:
   単例モードは設計モードで最も一般的なモードの一つであり、オブジェクト作成モードであり、オブジェクトの具体的なインスタンスを生産するために使用され、タワーはシステム内のクラスが1つのインスタンスしか生成しないことを保証することができる.javaではどのようなメリットがあるのだろうか.次に分析してみましょう
    一:頻繁に使用するオブジェクトについては、オブジェクトの作成にかかる時間を省略することができ、これはヘビー級オブジェクトに対してシステムオーバーヘッドである.
   二:new操作の回数が減少するため、システムメモリの使用頻度も低下し、GCの圧力を軽減し、GCの停止時間を多段にする.
したがって、システムのキーコンポーネントが頻繁にオブジェクトを使用する場合、単一のモードを使用すると、システムのパフォーマンスが効果的に改善され、単一のモードは非常に簡単で、単一のクラスと使用者だけが使用されます.
    次の例のモード実装コードを見てみましょう
public class Singleton {
	
	private Singleton() {
		System.out.println("Singleton   ");
	}
	
	private static Singleton instance = new Singleton();
	
	private static Singleton getInsSingleton() {
		return instance;
	}

}

単例モードには privateアクセスレベルのコンストラクション関数は、システム内の他のコード内でインスタンス化されないことを保証し、instanceメンバー変数とgetInstance()メソッドは静的でなければならない.
    シングル・インスタンス・モードの実装は簡単で信頼性が高いが、instanceインスタンスを遅延ロードすることはできない.シングル・インスタンスの作成が遅い場合、instanceメンバー変数は静的であるため、JVMがシングル・インスタンス・クラスをロードすると、シングル・インスタンス・オブジェクトが確立され、この場合、このシングル・インスタンス・クラスはシステムにおいて他の役割を果たす.Stringファクトリなどの文字列を作成するために使用されるかどうかにかかわらず、この単一変数は、この単一変数クラスを使用する場所で初期化されます.
public class Singleton {
	
	private Singleton() {
		System.out.println("Singleton   ");
	}
	
	private static Singleton instance = new Singleton();
	
	private static Singleton getInsSingleton() {
		return instance;
	}
	
	public static void createString() {
		System.out.println("  Sting   Singleton");
	}

}

Singleton.createStringタスクを実行すると、プログラムは次のように出力します.
Singletonの作成
StingのSingletonを作成する
この場合、単一のクラスは使用されないが、単一のクラスは作成され、この問題を解決するために、関連関数で呼び出されるシステムの反応速度を向上させるために、遅延ロードメカニズムを導入する必要があることがわかる.
public class LazySingleton {
	
	private LazySingleton() {
		System.out.println("Singleton   ");
	}
	
	private static LazySingleton instance = null;
	
	private static synchronized LazySingleton getInsSingleton() {
		if(instance == null) 
			instance = new LazySingleton();
		return instance;	
	}
}

   静的変数instanceに対して付与nullを初期化し、システムの起動に追加の負荷がないことを確認します.次に、getInstance()ファクトリメソッドでは、現在の単一例が存在するかどうかを判断し、戻りが存在する場合、作成は存在しません.また、getInstance()メソッドは同期でなければならない.そうしないと、マルチスレッド環境で最初のスレッドの作成が発生するのは、まだ値が付与されていない2番目のスレッドがnull再作成と判断する可能性がある.
    しかし,実装後,マルチスレッド環境では第1の単一例モードよりもはるかに時間がかかることが分かったので,次にこれを改造した.
        
public class StaticSingleton {
	
	private StaticSingleton() {
		System.out.println("Singleton   ");
	}
	
	private static class SingLetonHolder{
		private static StaticSingleton instance = new StaticSingleton();
	}
	
	public static StaticSingleton getInstance() {
		return SingLetonHolder.instance;
	}
	
}    


    この実装では、一例モードでは、一例のインスタンスを維持するために内部クラスを使用するが、StaticSingletonがロードされた場合、その内部クラスは初期化されず、StaticSingletonクラスがJVMにロードする場合、一例クラスは初期化されず、getInstance()メソッド呼び出し時にSingLetonHolderがロードされ、instanceが初期化する.
また、インスタンスの作成はクラスロード時に完了するため、マルチスレッドに友好的であり、getInstance()メソッドは同期修飾を必要としないため、実装メソッドは上記2つの実装の利点を同時に兼ね備えている.
        実はまだ终わっていないで、javaの中で1种の特殊な情况があるため、それは反射のメカニズムが强制的に単例のクラスの中の私有の构造を呼び出して、复数の単例を生成します.シーケンス化と逆シーケンス化も単例を破壊して、この2つの方式の解决方法は后で更新します!!!
    期待ing!!!