Java面接知識点(20)単例モードの怠け者式と餓漢式


単品モードの使用:単品モードはファクトリモードの特例に属しますが、パラメータを入力する必要はなく、常に同じオブジェクトの参照を返します.単一モードは、システム内のクラスのインスタンスが1つしかないというタイプのオブジェクトの一意性を保証します.その用途は非常に広く、例えば、ユーザーのメッセージごとにメッセージ情報をデータベースに書き込む簡単な伝言板を開発しました.最も直感的な方法は、書き込みをしないでデータベースのリンクを構築することです.これは簡単な方法で、合併を考えないときにもいい選択です.しかし、実際には、1つのサイトは同時であり、大量の同時操作がある可能性があります.書き込みのたびにデータベース接続を作成すると、簡単なシステムにボトルネックが発生し、直接クエリー操作ではなくメンテナンスリンクに多くの力がかかります.これは明らかに望ましくない.システムに唯一のデータベース接続オブジェクトが最初から最後まで存在することを保証できれば、メモリのオーバーヘッドとcpuの使用率を大幅に節約できることは明らかです.これが単品モードの用途です.
以下、単品モードの怠け者式と餓漢式について簡単に紹介する:1、餓漢式:プログラム起動または単品モードクラスがロードされたときに、単品モードのインスタンスが作成された.2、怠け者:プログラムが単品モードインスタンスに初めてアクセスしたときに作成されます.
どのように選択するか:単一のモードインスタンスがシステムでよく使用される場合、餓漢式は良い選択です.逆に、単一のモードがシステムであまり使われないか、ほとんど使われない場合は、怠け者式が良い選択です.
//       
class Singleton{
	//       ,           
	private Singleton(){}
	//           
	private static Singleton singleton = new Singleton();
	//    get  ,      s
	public static Singleton getInstance(){
		return singleton;
	}

//       
class Singleton {
	//        ,           
	private Singleton() {
	}
 
	//            
	private static Singleton singleton;
 
	//     get  ,      s
	public static Singleton getInstance(){
		//  singleton   null,   null,        
		if (singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
}

怠け者式はマルチスレッドではサポートされていないので、相対的には餓漢式、例えば、現在AスレッドとBスレッドがあり、AスレッドはちょうどこのgetInstance()メソッドで、空ではない(この場合null)と判断したばかりで、インスタンスを作成する必要があるが、BスレッドはCPUの実行権を奪い、Aスレッドsleepになった.この場合、Bスレッドもこの判断を行い、Aと同様にインスタンスを作成する必要があります.この場合、AもCPUを奪います.この場合、Bはsleepになります.そして、Aがインスタンス化を実行した後、BはCPUの実行権を奪い、Bもインスタンス化します.この場合、問題が発生しました.AとBはいずれもオブジェクトをインスタンス化しました.これが赤果の2つのオブジェクトですね.例は、唯一です.全部なくなりました.