Chapter 5 the Singleton Pattern

這就是傳說中的單例模式忆畅!O(∩_∩)O
一個某一類對象。
它只有唯一的一個對象實(shí)例尸执。

它有什么用?

因?yàn)橛行┠K必須保持唯一性缓醋,比如說線程池如失、緩存和注冊器等。

可不可以用全局變量來代替單例模式送粱?

單例模式是一種能夠確保創(chuàng)建唯一一個對象的途徑和方法褪贵。
你可以用全局變量來代替它,但是它的意義在于“確笨苟恚”二字脆丁。

它有啥優(yōu)點(diǎn)?

單例模式的作用在于它能夠在你想創(chuàng)建對象的時候創(chuàng)建动雹,即槽卫,你可以把握創(chuàng)建的時機(jī)。
而如果使用全局變量胰蝠,那么它只能在程序開始創(chuàng)建歼培,并在程序結(jié)束時釋放,它不是受你控制的茸塞。如果該全局變量十分占用資源躲庄,那么最好整個應(yīng)用自始至終都在使用它,否則全局變量的方法對系統(tǒng)不必要的開銷就非常大钾虐。

一個簡單的單例模式

P185展示了一個簡單的單例模式的基本構(gòu)成噪窘。另外,我寫了一篇跟Java有關(guān)的單例模式的博客效扫。

Singleton Pattern defined

它確保類有唯一一個實(shí)例倔监,并且提供了一個全局性的訪問點(diǎn)直砂。
P189展示了單例模式類圖的設(shè)計(jì)。

多線程環(huán)境下的單例模式

在多線程環(huán)境下各線程是獨(dú)立的丐枉,每個線程都可能擁有自己的單例哆键,那么從進(jìn)程的角度看一個進(jìn)程就可能有多個單例,那么這個就不是單例而是多例了嘛瘦锹!
其實(shí)主要要解決的就是多線程的互斥訪問籍嘹,針對JAVA語言的特性,作者建議在獲取實(shí)例的方法上加上synchronized關(guān)鍵字弯院,如P192所示的那樣辱士。這個很好理解,就是線程間的同步听绳,即各線程的公共資源颂碘。
但是這個synchronized是有代價的,這是因?yàn)橛玫絪ynchronized只是創(chuàng)建實(shí)例的那一刻椅挣,從那以后就用不著synchronized了头岔,但是你還需要為synchronized付出代價。

那有沒有其他的解決辦法呢鼠证?

  • 如果getInstance()對你的應(yīng)用影響不大峡竣,那它可以什么都不做。因?yàn)橥綍管浖谋憩F(xiàn)力降低100個因子量九,所以對于面向高速傳輸?shù)拇a來說饥瓷,你就不要同步了饿凛。
  • 轉(zhuǎn)向馬上要被創(chuàng)建的實(shí)例而不是那些不緩不慢的實(shí)例瘪阁。P193顯示了創(chuàng)建緊急單例實(shí)例的代碼臭蚁,這種途徑依賴于JVM,它能保證實(shí)例在所有線程訪問它之前被創(chuàng)建肌似。
  • 使用雙重鎖來減少getInstance()的同步费就。先檢查實(shí)例是否被創(chuàng)建了,如果沒有川队,那就同步受楼,這可以是getInstance()只同步一次,如P194代碼所示呼寸。volatile能夠防止編譯器自作主張地優(yōu)化艳汽。

其他

單例模式的類一般不能繼承,也不建議被繼承对雪。
不要濫用單例模式河狐,它應(yīng)該是少而精的。
濫用全局變量會污染命名空間。
多類裝載器會導(dǎo)致多個實(shí)例而并非單例馋艺,所以要慎用栅干。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捐祠,隨后出現(xiàn)的幾起案子碱鳞,更是在濱河造成了極大的恐慌,老刑警劉巖踱蛀,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窿给,死亡現(xiàn)場離奇詭異,居然都是意外死亡率拒,警方通過查閱死者的電腦和手機(jī)崩泡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猬膨,“玉大人角撞,你說我怎么就攤上這事〔眨” “怎么了谒所?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沛申。 經(jīng)常有香客問我百炬,道長,這世上最難降的妖魔是什么污它? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮庶弃,結(jié)果婚禮上衫贬,老公的妹妹穿的比我還像新娘。我一直安慰自己歇攻,他們只是感情好固惯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缴守,像睡著了一般葬毫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屡穗,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天贴捡,我揣著相機(jī)與錄音,去河邊找鬼村砂。 笑死烂斋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汛骂,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼罕模,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帘瞭?” 一聲冷哼從身側(cè)響起淑掌,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝶念,沒想到半個月后抛腕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祸轮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年兽埃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片适袜。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡柄错,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苦酱,到底是詐尸還是另有隱情售貌,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布疫萤,位于F島的核電站颂跨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扯饶。R本人自食惡果不足惜恒削,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尾序。 院中可真熱鬧钓丰,春花似錦、人聲如沸每币。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兰怠。三九已至梦鉴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揭保,已是汗流浹背肥橙。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秸侣,地道東北人快骗。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓娜庇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親方篮。 傳聞我的和親對象是個殘疾皇子名秀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

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

  • 1 場景問題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個應(yīng)用,讀取配置文件的內(nèi)容藕溅。 很多應(yīng)用項(xiàng)目匕得,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,771評論 12 68
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法巾表,內(nèi)部類的語法汁掠,繼承相關(guān)的語法,異常的語法集币,線程的語...
    子非魚_t_閱讀 31,632評論 18 399
  • 一:java概述:1考阱,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境鞠苟,java的開發(fā)工...
    ZaneInTheSun閱讀 2,653評論 0 11
  • 1 單例模式的動機(jī) 對于一個軟件系統(tǒng)的某些類而言乞榨,我們無須創(chuàng)建多個實(shí)例。舉個大家都熟知的例子——Windows任務(wù)...
    justCode_閱讀 1,433評論 2 9
  • 喧囂迷離的世界当娱,讓多少人迷失在了夜的繁華吃既,不在心懷光亮。 當(dāng)世界不再分為黑夜與光明跨细,我們這群堅(jiān)守在黎明末梢的夜鶯鹦倚,...
    夢遙公子閱讀 245評論 0 0