いくつかのよくあるJavaの単一の例のモードの書き方

9265 ワード

単利を実現するにはいろいろな書き方があります。ここではよくある書き方を挙げて、優劣を分析します。
  • 1.怠け者式
  • 欠点:非スレッドセキュリティ。マルチスレッドにおいて、スレッドがif判定に入ると、newのインスタンス操作がまだ実行されていない。他の例もif判定に入ると、複数のオブジェクトが実装され、メモリロスが
    	public class Singleton{
    		private Singleton(){};  
    		private static Singleton mInstance ;
    		public static newInstance(){
    			if(mInstance == null){
    				mInstance = new Singleton();
    			}
    			return mInstance;
    		}
    	}
    
  • をもたらす。
  • .怠け者式(同期方法)
  • 利点:最初の呼び出しは初期化され、メモリの無駄を避ける。
  • 欠点:synchronizedをロックしないと、単例を保証できませんが、ロックをかけると効率に影響があります。
  • 	public class Singleton{
    		private staitc Singleton mInstance;
    		private Singleton(){};
    		public static synchronized Singleton new Instance(){
    			if(mInstance == null){
    				mInstance = new Singleton();
    			}
    			return mInstance;
    		}
    	}
    
  • .餓漢式、スレッド安全
  • 利点:このような書き方は比較的簡単で、クラス搭載時に実用化される。スレッド同期問題を回避した。
  • 欠点:クラス搭載時に実装が完了し、Lazy Loadingの効果が達成されていません。この例を最初から最後まで使っていないと、メモリが無駄になります。
  • 	public class Singleton{
    		private final static Singleton mInstance = new SingleTon();
    		private Singleton(){};
    		public static Singleton newInstance(){
    				return mInstance;
    		}
    	}
    
  • .ダブルチェックロック
  • の利点:このような方式は二重ロック機構を採用し、安全でマルチスレッドの場合に高性能を維持することができる。get Instanceの性能はアプリケーションにとって重要です。
  • 	public class Singleton { 
    		private static volatile Singleton singleton;
    	    private Singleton() {}mInstance
    		public static Singleton getInstance() {
    	        if (mInstance == null) {
    	            synchronized (Singleton.class) {
    	                if (mInstance == null) {
    	                    mInstance = new Singleton();
    	                }
    	            }
    	        }
    	        return mInstance;
    	    }
    	}
    
  • .静的内部クラス
  • この方式はダブルロック方式のような効果を達成できますが、より簡単に実現できます。静的ドメインに対して遅延初期化を使用するには、このような方法を用いるべきであり、ダブルチェックロック方式ではない。この方法は静的ドメインの場合にのみ適用され、デュアルアンロック方式は、インスタンスドメインが遅延初期化を必要とするときに使用されてもよい。
  • 	public class Singleton {
    		private Singleton() {}
    		private static class SingletonInstance {
    		    private static final Singleton INSTANCE = new Singleton();
    		}	
    		public static Singleton getInstance() {
    		    return SingletonInstance.INSTANCE;
    		}
    	}
    
    他にも列挙方式の書き方があります。Androidは単例の使用を勧めないので、ここでは書きません。