你真的會(huì)寫(xiě)單例?

提到單例模式酬诀,相信都不會(huì)陌生脏嚷,今天對(duì)其進(jìn)行總結(jié)。

以下是單例模式的特點(diǎn):

  1. 單例類(lèi)只能有一個(gè)實(shí)例瞒御。
  2. 單例類(lèi)必須自己自己創(chuàng)建自己的唯一實(shí)例父叙。
  3. 單例類(lèi)必須給所有其他對(duì)象提供這一實(shí)例。

種類(lèi)的話(huà)不好說(shuō)有幾類(lèi),因?yàn)橐紤]到是否在多線(xiàn)程下運(yùn)行趾唱,下面來(lái)介紹主要的幾類(lèi):

懶漢類(lèi)

//懶漢式單例類(lèi).在第一次調(diào)用的時(shí)候?qū)嵗约?
public class Singleton {
    private Singleton() {
    }

    private static Singleton single = null;

    //靜態(tài)工廠(chǎng)方法 
    public static Singleton getInstance() {
        if (single == null) {
            single = new Singleton();
        }
        return single;
    }
}

懶漢么涌乳,所以在多線(xiàn)程下會(huì)失效,所以下面介紹三種懶漢的升級(jí)版來(lái)適應(yīng)多線(xiàn)程

  • 在getinstance前加上synchronized(同步)甜癞,但這導(dǎo)致的是每次getInstance都會(huì)去同步夕晓,消耗資源。
public class Singleton {
    private Singleton() {
    }

    private static Singleton single = null;

    // 靜態(tài)工廠(chǎng)方法
    public static synchronized Singleton getInstance() {
        if (single == null) {
            single = new Singleton();
        }
        return single;
    }
}
  • 雙重檢查鎖悠咱,它是在以上做的修改蒸辆,判斷兩次空,所以只有在第一次調(diào)用的時(shí)候會(huì)同步析既,避免了每次同步資源的消耗躬贡,注意 volatile 關(guān)鍵字。
public class Singleton {
    private Singleton() {
    }

    private volatile static Singleton singleton = null; // 聲明成 volatile 

    //靜態(tài)工廠(chǎng)方法
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
  • 內(nèi)部靜態(tài)類(lèi)眼坏,這種我覺(jué)得是最好的拂玻,既實(shí)現(xiàn)了線(xiàn)程安全,也避免了同步帶來(lái)的性能影響宰译。
public class Singleton {
    private static class LazyHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getInstance() {
        return LazyHolder.INSTANCE;
    }
}

餓漢類(lèi)

餓漢式是典型的空間換時(shí)間纺讲,當(dāng)類(lèi)裝載的時(shí)候就會(huì)創(chuàng)建類(lèi)的實(shí)例,不管你用不用囤屹,先創(chuàng)建出來(lái)熬甚,然后每次調(diào)用的時(shí)候,就不需要再判斷肋坚,節(jié)省了運(yùn)行時(shí)間乡括。

//餓漢式單例類(lèi).在類(lèi)初始化時(shí),已經(jīng)自行實(shí)例化
public class Singleton {
    private Singleton() {
    }

    private static final Singleton single = new Singleton();

    //靜態(tài)工廠(chǎng)方法
    public static Singleton getInstance() {
        return single;
    }
}

這種也是我比較喜歡的智厌,因?yàn)楹?jiǎn)單易懂诲泌,但當(dāng)實(shí)現(xiàn)了Serializable接口后,反序列化時(shí)單例會(huì)被破壞铣鹏,實(shí)現(xiàn)Serializable接口需要重寫(xiě)readResolve敷扫,才能保證其反序列化依舊是單例:

private Object readResolve() throws ObjectStreamException { 
    return single; 
}  

枚舉類(lèi)

public enum Singleton {
    INSTANCE;

    public void whateverMethod() {
    }
}

這種方式是Effective Java作者Josh Bloch 提倡的方式,它不僅能避免多線(xiàn)程同步問(wèn)題诚卸,而且還能防止反序列化重新創(chuàng)建新的對(duì)象葵第,可謂是很堅(jiān)強(qiáng)的壁壘啊,不過(guò)合溺,個(gè)人認(rèn)為由于1.5中才加入enum特性卒密,用這種方式寫(xiě)不免讓人感覺(jué)生疏,在實(shí)際工作中棠赛,我也很少看見(jiàn)有人這么寫(xiě)過(guò)哮奇。

以上就是常用的單例模式膛腐,一般的情況下,我會(huì)使用餓漢式鼎俘,只有在要明確實(shí)現(xiàn)lazy loading效果時(shí)才會(huì)使用內(nèi)部靜態(tài)類(lèi)哲身,另外,如果涉及到反序列化創(chuàng)建對(duì)象時(shí)我會(huì)試著使用枚舉的方式來(lái)實(shí)現(xiàn)單例贸伐,不過(guò)律罢,我一直會(huì)保證我的程序是線(xiàn)程安全的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棍丐,一起剝皮案震驚了整個(gè)濱河市误辑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歌逢,老刑警劉巖巾钉,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秘案,居然都是意外死亡砰苍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)阱高,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赚导,“玉大人,你說(shuō)我怎么就攤上這事赤惊『鹁桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵未舟,是天一觀(guān)的道長(zhǎng)圈暗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)裕膀,這世上最難降的妖魔是什么员串? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮昼扛,結(jié)果婚禮上寸齐,老公的妹妹穿的比我還像新娘。我一直安慰自己抄谐,他們只是感情好渺鹦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著斯稳,像睡著了一般海铆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挣惰,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼憎茂。 笑死珍语,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竖幔。 我是一名探鬼主播板乙,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拳氢!你這毒婦竟也來(lái)了募逞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤馋评,失蹤者是張志新(化名)和其女友劉穎放接,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體留特,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纠脾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜕青。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苟蹈。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖右核,靈堂內(nèi)的尸體忽然破棺而出慧脱,到底是詐尸還是另有隱情,我是刑警寧澤贺喝,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布磷瘤,位于F島的核電站,受9級(jí)特大地震影響搜变,放射性物質(zhì)發(fā)生泄漏采缚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一挠他、第九天 我趴在偏房一處隱蔽的房頂上張望扳抽。 院中可真熱鬧,春花似錦殖侵、人聲如沸贸呢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)楞陷。三九已至,卻和暖如春茉唉,著一層夾襖步出監(jiān)牢的瞬間固蛾,已是汗流浹背结执。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艾凯,地道東北人献幔。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像趾诗,于是被迫代替她去往敵國(guó)和親蜡感。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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

  • 你真的會(huì)寫(xiě)單例嗎? 摘錄來(lái)源 單例的正確姿勢(shì) Java單例模式可能是最簡(jiǎn)單也是最常用的設(shè)計(jì)模式贝乎,一個(gè)完美的單例需要...
    OCNYang閱讀 2,933評(píng)論 5 53
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡(jiǎn)單情连、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮?jiǎn)潔易懂糕非,是項(xiàng)目中最...
    成熱了閱讀 4,231評(píng)論 4 34
  • 前言 本文主要參考 那些年蒙具,我們一起寫(xiě)過(guò)的“單例模式”。 何為單例模式朽肥? 顧名思義禁筏,單例模式就是保證一個(gè)類(lèi)僅有一個(gè)...
    tandeneck閱讀 2,488評(píng)論 1 8
  • 1.單例模式概述 (1)引言 單例模式是應(yīng)用最廣的模式之一,也是23種設(shè)計(jì)模式中最基本的一個(gè)衡招。本文旨在總結(jié)通過(guò)Ja...
    曹豐斌閱讀 2,888評(píng)論 6 47
  • 文 | 東臨瑞 圖 | 網(wǎng)絡(luò)(侵刪) 注:最近太忙篱昔,忙著適應(yīng)自己的工作,真的是分身無(wú)暇始腾,就算有看劇的時(shí)間也沒(méi)剩...
    且以滄海寄余生閱讀 832評(píng)論 1 4