單例模式(懶漢式、雙重鎖、餓漢式、登記式)
阿新 • • 發佈:2019-01-01
單例模式確保某一個類只有一個例項
1.懶漢式是延時載入,在需要的時候才建立物件,避免記憶體浪費。但面臨著多執行緒訪問的安全性問題,需要做雙重鎖定才能保證安全。雙重鎖模式將同步內容下放到if內部,提高了執行的效率,不必每次獲取物件時都進行同步,只有第一次才同步,建立了以後就沒必要了。
2.餓漢式執行緒安全,類一載入就例項化物件,所以要提前佔用系統資源。
3.登記式內部類只有在外部類被呼叫才載入,產生例項,又不用加鎖。此模式有上述模式的優點,遮蔽了它們的缺點。
public class Singleton{//懶漢式 private static Singleton instance=null; private Singleton(){ } public static Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } }
public class Singleton{//雙重鎖模式 private static Singleton instance=null; private Singleton(){ } public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance==null){ instance=new Singleton(); } } } return instance; } }
public class Singleton{//餓漢式
private static final Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
public class Singleton {//登記式 private Singleton() {} public static Singleton getInstance() { return Holder.instance; } private static class Holder { private static final Singleton instance = new Singleton(); } }