單例模式5種實現(xiàn)方式詳解(靜態(tài)內(nèi)部類)

源博客:https://www.cnblogs.com/hupp/p/4487521.html

  1. 單線程環(huán)境使用
package test;
/**
 * @author xiaoping
 *
 */
public class Singleton {
    private static Singleton instance=null;

    private Singleton(){}

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

注解:Singleton的靜態(tài)屬性instance中婉支,只有instance為null的時候才創(chuàng)建一個實例,構(gòu)造函數(shù)私有,確保每次都只創(chuàng)建一個,避免重復(fù)創(chuàng)建。
缺點:只在單線程的情況下正常運行异雁,在多線程的情況下,就會出問題僧须。例如:當(dāng)兩個線程同時運行到判斷instance是否為空的if語句纲刀,并且instance確實沒有創(chuàng)建好時,那么兩個線程都會創(chuàng)建一個實例担平。

  1. 多線程的情況可以用示绊。(懶漢式,不好)
public class Singleton {
    private static Singleton instance=null;

    private Singleton(){}

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

注解:在解法一的基礎(chǔ)上加上了同步鎖暂论,使得在多線程的情況下可以用面褐。例如:當(dāng)兩個線程同時想創(chuàng)建實例,由于在一個時刻只有一個線程能得到同步鎖取胎,當(dāng)?shù)谝粋€線程加上鎖以后展哭,第二個線程只能等待。第一個線程發(fā)現(xiàn)實例沒有創(chuàng)建闻蛀,創(chuàng)建之匪傍。第一個線程釋放同步鎖,第二個線程才可以加上同步鎖循榆,執(zhí)行下面的代碼析恢。由于第一個線程已經(jīng)創(chuàng)建了實例,所以第二個線程不需要創(chuàng)建實例秧饮。保證在多線程的環(huán)境下也只有一個實例映挂。
缺點:每次通過getInstance方法得到singleton實例的時候都有一個試圖去獲取同步鎖的過程。而眾所周知盗尸,加鎖是很耗時的柑船。能避免則避免。

  1. 加同步鎖時泼各,前后兩次判斷實例是否存在(可行)
public class Singleton {
    private static Singleton instance=null;

    private Singleton(){}

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

注解:只有當(dāng)instance為null時鞍时,需要獲取同步鎖,創(chuàng)建一次實例扣蜻。當(dāng)實例被創(chuàng)建逆巍,則無需試圖加鎖。
缺點:用雙重if判斷莽使,復(fù)雜锐极,容易出錯。

  1. 餓漢式(建議使用)
public class Singleton {
    private static Singleton instance=new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}

注解:初試化靜態(tài)的instance創(chuàng)建一次芳肌。如果我們在Singleton類里面寫一個靜態(tài)的方法不需要創(chuàng)建實例灵再,它仍然會早早的創(chuàng)建一次實例肋层。而降低內(nèi)存的使用率。
缺點:沒有l(wèi)azy loading的效果翎迁,從而降低內(nèi)存的使用率栋猖。

  1. 靜態(tài)內(nèi)部內(nèi)。(建議使用)
public class Singleton {
    private Singleton(){}

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

注解:定義一個私有的內(nèi)部類汪榔,在第一次用這個嵌套類時蒲拉,會創(chuàng)建一個實例。而類型為SingletonHolder的類揍异,只有在Singleton.getInstance()中調(diào)用全陨,由于私有的屬性,他人無法使用SingleHolder衷掷,不調(diào)用Singleton.getInstance()就不會創(chuàng)建實例。
優(yōu)點:達到了lazy loading的效果柿菩,即按需創(chuàng)建實例戚嗅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枢舶,隨后出現(xiàn)的幾起案子懦胞,更是在濱河造成了極大的恐慌,老刑警劉巖凉泄,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躏尉,死亡現(xiàn)場離奇詭異,居然都是意外死亡后众,警方通過查閱死者的電腦和手機胀糜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒂誉,“玉大人教藻,你說我怎么就攤上這事∮蚁牵” “怎么了括堤?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绍移。 經(jīng)常有香客問我悄窃,道長,這世上最難降的妖魔是什么蹂窖? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任轧抗,我火速辦了婚禮,結(jié)果婚禮上恼策,老公的妹妹穿的比我還像新娘鸦致。我一直安慰自己潮剪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布分唾。 她就那樣靜靜地躺著抗碰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绽乔。 梳的紋絲不亂的頭發(fā)上弧蝇,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音折砸,去河邊找鬼看疗。 笑死,一個胖子當(dāng)著我的面吹牛睦授,可吹牛的內(nèi)容都是我干的两芳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼去枷,長吁一口氣:“原來是場噩夢啊……” “哼怖辆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起删顶,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤竖螃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逗余,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體特咆,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年录粱,在試婚紗的時候發(fā)現(xiàn)自己被綠了腻格。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡关摇,死狀恐怖荒叶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情输虱,我是刑警寧澤些楣,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站宪睹,受9級特大地震影響愁茁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亭病,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一鹅很、第九天 我趴在偏房一處隱蔽的房頂上張望旁舰。 院中可真熱鬧玛追,春花似錦晃琳、人聲如沸库菲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佑吝。三九已至,卻和暖如春绳匀,著一層夾襖步出監(jiān)牢的瞬間芋忿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工疾棵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戈钢,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓是尔,卻偏偏與公主長得像殉了,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拟枚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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