單例模式

定義

確保一個類只有一個實(shí)例,并提供一個全局訪問點(diǎn)

Ensure a class only has one instance, and provide a global point of access to it.

使用場景

  • 必須只有一個類的一個實(shí)例,并且它必須可以從公知的接入點(diǎn)訪問客戶端
  • 當(dāng)單個實(shí)例應(yīng)該通過子類化擴(kuò)展時,客戶端應(yīng)該能夠使用擴(kuò)展實(shí)例而不修改它們的代碼

典型使用場景

  • 日志類
  • 數(shù)據(jù)庫連接
  • 文件管理器

例子

一個經(jīng)典的單例:

public class Singleton{
    private static Singleton instance;
    private Singleton(){}
    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

考慮到多線程:

// 1. synchronized  性能差
public class Singleton{
    private static Singleton instance;
    private Singleton(){}
    // synchronized可以確保只能有一個線程進(jìn)入下面的程序
    public static  synchronized Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

// 2. 急切創(chuàng)建實(shí)例,而不用延遲實(shí)例化的做法
public class Singleton{
    // JVM加載這個類時馬上創(chuàng)建此唯一的單件實(shí)例
    private static Singleton instance = new Singleton();
    private Singleton(){}
    public static  synchronized Singleton getInstance(){
        return instance;
    }
}

// 3. 雙重檢查加鎖 在getInstance()中減少使用同步
public class Singleton{
    // Volatile確保多線程正確地處理instance
    private Volatile static Singleton instance;
    private Singleton(){}
    public static Singleton getInstance(){
        if(instance == null){ // 檢查實(shí)例,如果不存在,就進(jìn)入同步區(qū)域
            synchronized (Singleton.class) { // 只有第一次才徹底執(zhí)行這里的代碼
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

參考

iluwatar/java-design-patterns

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

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

  • 1 場景問題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個應(yīng)用,讀取配置文件的內(nèi)容。 很多應(yīng)用項(xiàng)目,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,983評論 12 68
  • 1 單例模式的動機(jī) 對于一個軟件系統(tǒng)的某些類而言,我們無須創(chuàng)建多個實(shí)例。舉個大家都熟知的例子——Windows任務(wù)...
    justCode_閱讀 1,568評論 2 9
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,724評論 19 139
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡單、最易理解的設(shè)計模式,也因?yàn)樗暮啙嵰锥?,是?xiàng)目中最...
    成熱了閱讀 4,549評論 4 34
  • 1.單例模式概述 (1)引言 單例模式是應(yīng)用最廣的模式之一,也是23種設(shè)計模式中最基本的一個。本文旨在總結(jié)通過Ja...
    曹豐斌閱讀 3,078評論 6 47

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