【Java】線程安全的單例模式----靜態(tài)內(nèi)部類

單例模式作為一種常見的設(shè)計(jì)模式森书,在程序中非常常見,主要是為了保證一個類只有一個唯一的對象谎势。

從簡單的“餓漢式”凛膏、“懶漢式”→利用 synchronized 和 復(fù)雜的“雙重校驗(yàn)DCL模式”,是一個考慮線程安全的過程(其實(shí)靜態(tài)的餓漢式單例模式也是線程安全的脏榆,后文有提到)猖毫。

后來有一篇文章上說“雙重校驗(yàn)DCL模式”其實(shí)并不是線程安全的,我沒看懂他說的原因(原文在此)须喂,但后來發(fā)現(xiàn)了另一種實(shí)現(xiàn)線程安全的單例模式吁断,靜態(tài)內(nèi)部類方式,代碼如下:

public class SingletonPattern {

    private SingletonPattern() {
    }

    private static class SingletonPatternHolder {
        private static final SingletonPattern singletonPattern = new SingletonPattern();
    }

    public static SingletonPattern getInstance() {
        return SingletonPatternHolder.singletonPattern;
    }
}

剛開始我覺得這種方式挺有意思的坞生,但是不明白為什么要這么寫仔役,為此我專門請教了一位Java大神,他今天有空給我解釋了原因是己,我總結(jié)一下又兵。

在這個例子中內(nèi)部類 SingletonPatterHolder 的靜態(tài)變量 singletonPattern,這個變量是我們需要的那個單例赃泡,即外部類 SingletonPattern 的對象寒波,就是那個我們需要的唯一的對象。

當(dāng)我們調(diào)用 SingletonPattern.getInstance() 時升熊,內(nèi)部類 SingletonPatternHolder 才會初始化俄烁,靜態(tài)變量 singletonPattern 被創(chuàng)建出來。

這個實(shí)現(xiàn)思路中最主要的一點(diǎn)就是利用類中靜態(tài)變量的唯一性级野。

這種方式的優(yōu)點(diǎn)是:

  1. 不用 synchronized 页屠,節(jié)省時間(雖然synchronized 浪費(fèi)那個時間根本不算什么時間粹胯。唉!時間就是生命辰企,聽說不用synchronized 會快100倍风纠,哈哈!)牢贸;
  2. 調(diào)用 getInstance() 的時候才會創(chuàng)建對象竹观,不調(diào)用不創(chuàng)建,節(jié)省空間潜索,這有點(diǎn)像傳說中的懶漢式臭增。

剛開始我還有點(diǎn)疑惑,內(nèi)部類 SingletonPatternHolder 是靜態(tài)的竹习,那么外部類 SingletonPattern 加載的時候誊抛,內(nèi)部類 SingletonPatternHolder 會被加載,后來想起來整陌,靜態(tài)內(nèi)部類與外部類沒有什么大的關(guān)系拗窃,外部類加載的時候,內(nèi)部類不會被加載泌辫,靜態(tài)內(nèi)部類只是調(diào)用的時候用了外部類的名字而已随夸。

最后想了想,還是把靜態(tài)餓漢式單例模式也寫出來(線程安全)震放,做個比較逃魄。

public class SingletonPattern {

    private static final SingletonPattern singletonPattern = new SingletonPattern();

    private SingletonPattern() {
    }

    public static SingletonPattern getInstance() {
        return singletonPattern;
    }
}

這個寫法也是利用類的靜態(tài)變量的唯一性,跟上面的靜態(tài)內(nèi)部類有異曲同工之妙澜搅,不過這種方式有一點(diǎn)不足,就是類加載的時候單例對象也會跟著加載邪锌,拖延類加載速度勉躺,有時候沒用到這個類的單例對象的話,會浪費(fèi)空間觅丰。有點(diǎn)較真哈饵溅。

《本文完》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妇萄,隨后出現(xiàn)的幾起案子蜕企,更是在濱河造成了極大的恐慌,老刑警劉巖冠句,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轻掩,死亡現(xiàn)場離奇詭異,居然都是意外死亡懦底,警方通過查閱死者的電腦和手機(jī)唇牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丐重,你說我怎么就攤上這事腔召。” “怎么了扮惦?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵臀蛛,是天一觀的道長。 經(jīng)常有香客問我崖蜜,道長浊仆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任纳猪,我火速辦了婚禮氧卧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氏堤。我一直安慰自己沙绝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布鼠锈。 她就那樣靜靜地躺著闪檬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪购笆。 梳的紋絲不亂的頭發(fā)上粗悯,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音同欠,去河邊找鬼样傍。 笑死,一個胖子當(dāng)著我的面吹牛铺遂,可吹牛的內(nèi)容都是我干的衫哥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼襟锐,長吁一口氣:“原來是場噩夢啊……” “哼撤逢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粮坞,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蚊荣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后莫杈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體互例,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年筝闹,在試婚紗的時候發(fā)現(xiàn)自己被綠了敲霍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俊马。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肩杈,靈堂內(nèi)的尸體忽然破棺而出柴我,到底是詐尸還是另有隱情,我是刑警寧澤扩然,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布艘儒,位于F島的核電站,受9級特大地震影響夫偶,放射性物質(zhì)發(fā)生泄漏界睁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一兵拢、第九天 我趴在偏房一處隱蔽的房頂上張望翻斟。 院中可真熱鬧,春花似錦说铃、人聲如沸访惜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽债热。三九已至,卻和暖如春幼苛,著一層夾襖步出監(jiān)牢的瞬間窒篱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工舶沿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墙杯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓括荡,卻偏偏與公主長得像霍转,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子一汽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法低滩,內(nèi)部類的語法召夹,繼承相關(guān)的語法,異常的語法恕沫,線程的語...
    子非魚_t_閱讀 31,582評論 18 399
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡單监憎、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮啙嵰锥羲荩琼?xiàng)目中最...
    成熱了閱讀 4,227評論 4 34
  • 一:java概述:1鲸阔,JDK:Java Development Kit偷霉,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,629評論 0 11
  • 1 場景問題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個應(yīng)用褐筛,讀取配置文件的內(nèi)容类少。 很多應(yīng)用項(xiàng)目,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,651評論 12 68
  • 距離得知您癌癥晚期的消息不過十天渔扎,距離上次見您不過三天硫狞。您笑著跟我說:現(xiàn)在你媽媽也在,以后隨時回來晃痴。我回來了残吩。回來...
    我在打瞌睡閱讀 395評論 0 1