單例模式,今天你用了嘛

BurdeNing發表於2019-02-13

連載文章

1.前言

提起設計模式,可能大家有些人會感覺陌生,有些人會覺得經常使用。其實說到設計模式,不用感到陌生與害怕,其實我們每天在不經意間都在或多或少的使用或者接觸設計模式。這篇文章就是想帶大家瞭解最基礎的設計模式,單例模式!

2.簡介

單例模式是指,有且只有一個該類的例項化物件,並且例項化過程由這個類自己實現。該類的建構函式是私有化的。

3.常見的幾種單例模式

餓漢式單例模式

/**
 * 作者:jtl
 * 日期:Created in 2019/1/25 15:48
 * 描述:餓漢式單例模式
 * 優點:1.空間換時間,每次都直接載入,節約了建立例項的時間
 * 缺點:1.因為不管是否用到了該類,都會直接建立例項,所以在不使用的情況下,就浪費了空間
 */

public class HungrySingleton {
    private static HungrySingleton sSingleton = new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getInstance(){
        return sSingleton;
    }
}
複製程式碼

懶漢式單例模式

/**
 * 作者:jtl
 * 日期:Created in 2019/1/25 15:45
 * 描述:懶漢式單例模式
 * 優點:1.時間換空間,在呼叫的時候才建立例項,節約了空間
 *      2.每次getInstance的時候才建立例項,節約了資源
 *
 * 缺點:1.每次在呼叫的時候才建立例項,有點浪費時間
 *      2.每次呼叫getInstance都需要執行緒同步,造成不必要的開銷
 */

public class LazySingleton {
    private static LazySingleton sSingleton;

    private LazySingleton(){}

    public static synchronized LazySingleton getInstance(){
        if (sSingleton==null){
            sSingleton=new LazySingleton();
        }

        return sSingleton;
    }
}
複製程式碼

DCL(Double Check Lock)單例模式

/**
 * 作者:jtl
 * 日期:Created in 2019/1/25 16:16
 * 描述:DCL(Double Check Lock)單例模式
 * 優點:1.在懶漢式的基礎上進行了判斷,只有在第一次建立例項的時候才會,進行執行緒同步操作。資源利用率高
 * 缺點:1.高併發情況下會出現問題
 *      2.JDK1.5之前會出現問題。由於Java編譯器允許處理器亂序執行,JDK之前JMM中Cache暫存器到主記憶體回寫順序的規定,可能1-2-3,也可能1-3-2,所以可能JDK1.5之前出現問題
 *      (1)給DclSingleton分配記憶體
 *      (2)呼叫DclSingleton()的建構函式,初始化成員欄位;
 *      (3)將mSingleton指向分配的記憶體空間(此時mSingleton不為null)
 */

public class DclSingleton {
    private static DclSingleton mSingleton=null;
    private DclSingleton(){}

    public static DclSingleton getInstance(){
        if (mSingleton==null){
            synchronized (DclSingleton.class){
                if (mSingleton==null){
                    mSingleton=new DclSingleton();
                }
            }
        }

        return mSingleton;
    }
}
複製程式碼

靜態內部類單例模式

/**
 * 作者:jtl
 * 日期:Created in 2019/1/25 16:14
 * 描述:靜態內部類單例模式
 * 優點:1.保證了執行緒安全問題,也能保證單例的唯一性(推薦)
 * 缺點:
 */

public class StaticSingleton {
    private StaticSingleton(){}

    private static StaticSingleton getInstance(){
        return StaticSingletonHolder.sSingleton;
    }

    private static class StaticSingletonHolder{
        private static final StaticSingleton sSingleton=new StaticSingleton();
    }
}
複製程式碼

4.後續

上面例舉了幾種常見的單例模式,其中本人最為常用的是靜態內部類單例模式。當然這四種並不是所有的單例模式,還有列舉單例模式,以及使用Map容器實現的單例模式。如果是想直接找一個單例模式使用的話,那就直接複製程式碼就好。如果想知道他們的優缺點的話,就可以看下注釋。還是那句話風裡雨裡在這裡等你,您的一個贊或者收藏就是我寫下去的動力,希望大家共同進步。如有錯誤請及時提出我也好改正。 另附GitHub原始碼地址:https://github.com/13046434521/DesignPatterns

相關文章