1. 程式人生 > >單例模式(懶漢式、雙重鎖、餓漢式、登記式)

單例模式(懶漢式、雙重鎖、餓漢式、登記式)

單例模式確保某一個類只有一個例項

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();
    }
}