單例模式


1、定義

確保一個類只有一個實例,并且自行實例化,為整個系統(tǒng)提供實例

2妆丘、要點

從上面這句描述可以看出有三個要點,從具體實現(xiàn)來講這三個要點:

  1. 單例模式的類只提供私有的構(gòu)造函數(shù)
  2. 類定義中含有一個該類的靜態(tài)私有對象
  3. 該類提供了一個靜態(tài)的公有的函數(shù)用于創(chuàng)建或獲取它本身的靜態(tài)私有對象

3局劲、實現(xiàn)

3.1勺拣、餓漢式

public class HungrySingleton {
    //構(gòu)造函數(shù)有private,防止通過new創(chuàng)建更多對象,確保只要一個對象
    private HungrySingleton(){
    }

    //在類初始化時鱼填,已經(jīng)自行實例化,所以是線程安全的
    private static final HungrySingleton HUNGRY_SINGLETON = new HungrySingleton();

    public static HungrySingleton getInstance(){
        return HUNGRY_SINGLETON;
    }
}

優(yōu)點:寫法簡單药有,線程安全
缺點:沒有懶加載的效果,如果沒有使用過的話會照成內(nèi)存浪費
可用性:可用

3.2苹丸、懶漢式(線程安全)

public class LazySingleton {
    private LazySingleton() {
    }
    private static LazySingleton singleton = null;
    //加上synchronized同步愤惰,線程安全
    public synchronized static LazySingleton getInstance(){
        if (singleton == null){
            //在第一次調(diào)用getInstance()時才實例化,實現(xiàn)懶加載,所以叫懶漢式
            singleton = new LazySingleton();
        }
        return singleton;
    }
}

優(yōu)點:實現(xiàn)了懶加載效果谈跛,線程安全
缺點:效率低羊苟,使用synchronized會照成不必要的同步開銷,而且大部分情況下不需要使用同步
可用性:不推薦

3.3感憾、雙重檢查鎖定DCL

public class DCLSingleton {

    //volatile 能夠防止代碼的重排序蜡励,保證得到的對象是初始化過
    private volatile static DCLSingleton singleton;

    private DCLSingleton() {
    }

    public static DCLSingleton getInstance(){
        if (singleton == null){//第一次檢查令花,避免不必要的同步
            synchronized (DCLSingleton.class){
                if (singleton == null){//第二次檢查
                    singleton = new DCLSingleton();
                }
            }
        }
        return singleton;
    }
}

優(yōu)點:實現(xiàn)懶加載效果,線程安全凉倚,效率較高
缺點:volatile影響一點性能兼都,高并發(fā)情況下有一定的缺陷,某些情況下DCL會失效稽寒,雖然概率較小扮碧。
可用性:推薦

3.4、靜態(tài)內(nèi)部類

public class StaticSingleton {
    private StaticSingleton() {
    }

    //靜態(tài)內(nèi)部類
    private static class SingleTonHolder{
        private static final StaticSingleton singleton = new StaticSingleton();
    }

    public static StaticSingleton getInstance(){
        //第一次調(diào)用getInstance方法時才加載SingletonHolder并初始化sInstance
        return SingleTonHolder.singleton;
    }
}

優(yōu)點:懶加載杏糙,線程安全慎王,效率高
可用性:推薦

3.5、枚舉單例

public enum EnumSingleton {
    INSTANCE;   //定義一個枚舉的元素宏侍,它就是Singleton的一個實例
    public void whatTodo() {
    }
}

優(yōu)點:寫法簡單赖淤,線程安全,能防止反序列化重新創(chuàng)建新的對象
缺點:可讀性低谅河,枚舉會比靜態(tài)常量多一點點內(nèi)存
可用性:可使用

4咱旱、場景

  1. 工具類對象
  2. 頻繁訪問數(shù)據(jù)庫或文件的對象
  3. 創(chuàng)建對象時耗時過多或者耗資源多的,又經(jīng)常使用到的對象

5绷耍、優(yōu)點

  1. 內(nèi)存中只有一個對象吐限,節(jié)省系統(tǒng)資源
  2. 避免對資源的多重占用,例如一個文件操作褂始,由于只有一個實例存在內(nèi)存中诸典,避免對同一資源文件的同時操作

6、缺點

  1. 單例對象如果持有context病袄,那么很容易引發(fā)內(nèi)存泄漏
  2. 單例一般沒有接口搂赋,很難拓展
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市益缠,隨后出現(xiàn)的幾起案子脑奠,更是在濱河造成了極大的恐慌,老刑警劉巖幅慌,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宋欺,死亡現(xiàn)場離奇詭異,居然都是意外死亡胰伍,警方通過查閱死者的電腦和手機齿诞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骂租,“玉大人祷杈,你說我怎么就攤上這事∩” “怎么了但汞?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵宿刮,是天一觀的道長。 經(jīng)常有香客問我私蕾,道長僵缺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任踩叭,我火速辦了婚禮磕潮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘容贝。我一直安慰自己自脯,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布嗤疯。 她就那樣靜靜地躺著冤今,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茂缚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天屋谭,我揣著相機與錄音脚囊,去河邊找鬼。 笑死桐磁,一個胖子當著我的面吹牛悔耘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播我擂,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼衬以,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了校摩?” 一聲冷哼從身側(cè)響起看峻,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衙吩,沒想到半個月后互妓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡坤塞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年冯勉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摹芙。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡灼狰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浮禾,到底是詐尸還是另有隱情交胚,我是刑警寧澤坛悉,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站承绸,受9級特大地震影響裸影,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜军熏,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一轩猩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荡澎,春花似錦均践、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至或衡,卻和暖如春焦影,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背封断。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工斯辰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坡疼。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓彬呻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柄瑰。 傳聞我的和親對象是個殘疾皇子闸氮,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容