「Android」單例的五種寫法

單例

發現博客園能夠很好的設置本身的博客文章的展現,很開心,而後特此發一篇java

其實這幾種寫法你們應該都會的,就權當拿來記錄一下吧,之後複習鞏固也比較方便。 
這篇文章中的代碼,來自一篇視頻(我想找視頻貼上,但我沒找到,之後有機會看到再貼吧,實很差意思),上面有講到,我以爲很好,擇錄了一些下來。面試

1.安全

//懶人寫法|原始
//缺點:類加載的時候就初始化實例,會拖慢應用啓動速度
public class PlainOldSingleton {
    private static PlainOldSingleton INSTANCE = new PlainOldSingleton();
    private PlainOldSingleton(){}
    public static PlainOldSingleton getInstance(){
        return INSTANCE;
    }
}

2.性能

//懶加載
//缺點:不是線程安全的,有可能線程A和線程B來同時訪問INSTANCE的話,會new出兩個實例,若是有多個線程的話,就會new出多個實例
public class LazyNotThreadSafe{
    private static LazyNotThreadSafe INSTANCE;
    private LazyNotThreadSafe(){}
    public static LazyNotThreadSafe getInstance(){
        if(INSTANCE == null){
            INSTANCE = new LazyNotThreadSafe();
        }
        return INSTANCE;
    }
}

3.線程

//同步鎖
//缺點:每次獲取都會加鎖,會有必定的性能開銷
//優勢:線程安全
public class LazyThreadSafeSynchronized{
    private static LazyThreadSafeSynchronized INSTANCE;
    private LazyThreadSafeSynchronized(){}
    public static synchronized LazyThreadSafeSynchronized getInstance(){
        if(INSTANCE == null){
            INSTANCE = new LazyThreadSafeSynchronized();
        }
        return INSTANCE;
    }
}

4.code

//雙重驗證
//面試多考,volatile是java1.5以後的一個內容,要理解這個須要懂Java虛擬機
public class LazyThreadSafeDoubleCheck{
    private static voltatile LazyThreadSafeDoubleCheck INSTANCE;
    private LazyThreadSafeDoubleCheck(){}
    public static LazyThreadSafeDoubleCheck getInstance(){
        if(INSTANCE == null){
            synchronized (LazyThreadSafeDoubleCheck.class){
                if(INSTANCE == null){
                    INSTANCE = new LazyThreadSafeDoubleCheck();
                }
            }
        }
        return INSTANCE;
    }
}

5.視頻

//靜態內部類
//優雅,實現了懶加載和線程安全,線程安全利用了虛擬機的機制
public class LazyThreadSafeStaticInnerClass{
    private static class Holder{
        private static LazyThreadSafeStaticInnerClass INSTANCE == new LazyThreadSafeStaticInnerClass();
    }
    private LazyThreadSafeStaticInnerClass(){}
    public static LazyThreadSafeStaticInnerClass getInstance(){
        return Holder.INSTANCE;
    }
}
相關文章
相關標籤/搜索