「Android」單例的五種寫法


單例

發現博客園可以很好的設置自己的博客文章的展示,很開心,然后特此發一篇

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

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.

//雙重驗證
//面試多考,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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM