單例模式

定義:確保一個類只有一個實列。
單列模式有幾個要點:
1、定義一個私有的構(gòu)造函數(shù)
2、一個私有的變量
3、公開的靜態(tài)的獲取實例的方法
4、確保多線程下實例化對象只有一個
將構(gòu)造方法私有化,使得客戶端不能通過new的形式來獲取實例。單列會暴露一個獲取實例的靜態(tài)的方法獲取唯一的對象。獲取單列需要線程安全,尤其是在多線程的環(huán)境下。
通常是用于該類需要消耗較多的資源或者沒有多個實例的情況。

public class Singleton {
    //私有的成員變量
    private static Singleton mSingleton = new Singleton();
    //私有的構(gòu)造放啊發(fā)
    private Singleton(){}
    //對外公開獲取實例的方法
    public static Singleton getInstance() {
        return mSingleton;
    }
}

DCL方式實現(xiàn)單例

public class Singleton {
    
    private volatile static Singleton sInstance = null;
    private Singleton(){}
    
    public static Singleton getInstance() {
        if (sInstance != null) {
            synchronized (Singleton.class) {
                if (sInstance != null){
                    sInstance = new Singleton();
                }
            }
        }
        
        return sInstance;
    }
}

在獲取實例的時候進行了兩次判空,為什么這么做呢,因為sInstance = new Singleton();這里看起來是一句代碼,但實際上并不是一個原子操作,這句這句代碼最終會被編譯成多條匯編指令,它大致做了三件事情:
1、給Sington實例分配內(nèi)存
2、調(diào)用Sington的構(gòu)造函數(shù),初始化成員
3、將sInstance引用執(zhí)行Sington的內(nèi)存地址
但是由于java編譯器是亂序執(zhí)行的,第二第三步驟無法保證執(zhí)行順序,如果執(zhí)行的是3-2,當(dāng)這個線程執(zhí)行完成3之后,另一個線程來取,但是這時候還未執(zhí)行2步驟,如果另個線程使用這個還未實例化的對象就會出現(xiàn)DCL(Double Check Lock)失效,所以加上volatitle關(guān)鍵字(用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改后的最的值),保證每次從內(nèi)存取。

  • 靜態(tài)內(nèi)部類的方式
    因為DCL單例模式會有一定概率早哼DCK失效,所以不建議用這種方式,而建議用下列方式:
public class Singleton {
    private Singleton() {}
    
    public static Singleton getInstance() {
        return SingletonHolder.sInstance;
    }
    
    public static class SingletonHolder {
        public static final Singleton sInstance = new Singleton();
    }
}

這種方式只有在調(diào)用getInstance方法的時候才去初始化SingletonHolder類,既保證了單一實例有保證了延時加載,還保證了線程安全。

  • 優(yōu)點:
    1、單例模式全局只有實例,減少了系統(tǒng)開銷,特別是一個類需要頻繁的創(chuàng)建銷毀而無法進行內(nèi)存優(yōu)化的時候。優(yōu)勢就特別明顯。
    2、單利模式為一個全局資源的訪問提供了便利。
  • 缺點:單例模式可擴展性差。

補充:這樣的單利模式是餓漢模式,與之對應(yīng)的是懶漢模式,還有通過靜態(tài)內(nèi)聚類創(chuàng)建實例的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,539評論 19 139
  • 單例模式(SingletonPattern)一般被認為是最簡單、最易理解的設(shè)計模式,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,532評論 4 34
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,604評論 30 472
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,939評論 25 709
  • Y同學(xué),你好: 說實話,可能我真的是有些一廂情愿,但是還是想給自己一個機會,不讓自己后悔自己沒有爭取過。 我想說Y...
    2017安好閱讀 270評論 0 1

友情鏈接更多精彩內(nèi)容