設計模式-單例模式


原文地址:LoveDev

單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一利花,該模式確保一個類只有一個實例

單例模式
單例模式

懶漢式,線程不安全

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

懶漢式使用懶加載模式灾而,但是在多線程環(huán)境中調(diào)用 getInstance() 就會創(chuàng)建多個實例

懶漢式,線程安全

class SynchronizedLazySingleton {

    private static SynchronizedLazySingleton instance;
    private SynchronizedLazySingleton(){}
    
    //添加synchronized關(guān)鍵字
    public static synchronized SynchronizedLazySingleton getInstance() {
        if (instance == null) {
            instance = new SynchronizedLazySingleton();
        }
        return instance;
    }
}

getInstance() 方法加上 synchronized 關(guān)鍵字實現(xiàn)線程安全商乎,但是該方法效率上有問題攀细,任何時候只能有一個線程調(diào)用 getInstance() 獲取實例箫措,而且實例第一次創(chuàng)建之后就不需要同步操作

餓漢式,線程安全

class HungrySingleton {

    private static final HungrySingleton instance = new HungrySingleton();

    private HungrySingleton(){}
    public static HungrySingleton getInstance(){
        return instance;
    }
}

實例被 static final 修飾哎迄,類加載時就會初始化回右,但它不是懶加載模式,如果 HungrySingleton 實例的創(chuàng)建需要某個條件參數(shù)漱挚,這種寫法就不能實現(xiàn)

雙重檢驗鎖

class DoubleCheckedSingleton {

    private volatile static DoubleCheckedSingleton instance;

    private DoubleCheckedSingleton() {}

    public static DoubleCheckedSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckedSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckedSingleton();
                }
            }
        }
        return instance;
    }
}

為了避免在多線程環(huán)境中執(zhí)行 instance = new DoubleCheckedSingleton() 造成指令重排序翔烁,添加 volatile 關(guān)鍵字修飾,禁止指令重排序優(yōu)化旨涝,拋開代碼可讀性來說這種寫法已經(jīng)完美了租漂,但是這樣你就滿足了嗎?沒有的話就接著看下去吧

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

class StaticSingleton {

    private static class SingletonHolder {
        private static final StaticSingleton INSTANCE = new StaticSingleton();
    }
    private StaticSingleton (){}
    public static final StaticSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

該方法為 《Effective Java》上推薦的颊糜,它是懶漢式哩治,并且性能沒有缺陷

枚舉

enum  EnumSingleton {
    INSTANCE
}

最簡單的單例類,沒有之一衬鱼,還能防止序列化導致重新創(chuàng)建新的對象

思考

以上介紹的單例模式的寫法均在單一進程中有效业筏,如果是多進程環(huán)境中,這些寫法均不能保證實例的唯一性鸟赫,如何在多進程環(huán)境中保證單例模式的特性呢蒜胖?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抛蚤,隨后出現(xiàn)的幾起案子台谢,更是在濱河造成了極大的恐慌,老刑警劉巖岁经,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋沮,死亡現(xiàn)場離奇詭異,居然都是意外死亡缀壤,警方通過查閱死者的電腦和手機樊拓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塘慕,“玉大人筋夏,你說我怎么就攤上這事⊥寄兀” “怎么了条篷?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵骗随,是天一觀的道長。 經(jīng)常有香客問我赴叹,道長蚊锹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任稚瘾,我火速辦了婚禮,結(jié)果婚禮上姚炕,老公的妹妹穿的比我還像新娘摊欠。我一直安慰自己,他們只是感情好柱宦,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布些椒。 她就那樣靜靜地躺著,像睡著了一般掸刊。 火紅的嫁衣襯著肌膚如雪免糕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天忧侧,我揣著相機與錄音石窑,去河邊找鬼。 笑死蚓炬,一個胖子當著我的面吹牛松逊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肯夏,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼经宏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驯击?” 一聲冷哼從身側(cè)響起烁兰,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徊都,沒想到半個月后沪斟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡暇矫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年币喧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袱耽。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡杀餐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朱巨,到底是詐尸還是另有隱情史翘,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站琼讽,受9級特大地震影響必峰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钻蹬,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一吼蚁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧问欠,春花似錦肝匆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至注整,卻和暖如春能曾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肿轨。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工寿冕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人椒袍。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓蚂斤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親槐沼。 傳聞我的和親對象是個殘疾皇子曙蒸,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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

  • 目錄 本文的結(jié)構(gòu)如下: 什么是單例模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點和缺點 適用環(huán)境 模式應用 總...
    w1992wishes閱讀 388評論 1 2
  • 單例模式 介紹 為了節(jié)約系統(tǒng)資源,有時需要確保系統(tǒng)中某個類只有唯一一個實例岗钩,當這個唯一實例創(chuàng)建成功之后纽窟,我們無法再...
    666真666閱讀 343評論 0 6
  • 單例模式(Singleton Pattern)是眾多設計模式中較為簡單的一個,同時它也是面試時經(jīng)常被提及的問題兼吓,如...
    廖少少閱讀 558評論 0 1
  • 概念 java中單例模式是一種常見的設計模式臂港,單例模式的寫法有好幾種,比較常見的有:懶漢式單例视搏、餓漢式單例审孽。單例模...
    怡紅快綠閱讀 454評論 0 0
  • 今夜我不想遇到世上的一切 除了你 我多想見你一眼就死去 然后將我的骨灰撒在你將要走過的路上 你走過的時候我就與你相遇
    自由行走的貓1998閱讀 181評論 1 3