設(shè)計模式之單例模式

單例模式,是設(shè)計模式中最簡單的一種。通過單例模式可以保證系統(tǒng)中的某個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源痰腮。如果希望讓系統(tǒng)中某個類的對象只能存在一個,單例模式就是最好的解決方案律罢。但是膀值,單例模式真的能夠?qū)崿F(xiàn)實例的唯一性嗎?

答案是否定的误辑,很多人都知道使用反射可以破壞單例模式沧踏,除了反射以外,使用序列化與反序列化也同樣會破壞單例巾钉。

比如創(chuàng)建一個User 單例:

這種創(chuàng)建方式就是常說的餓漢模式:在User類被JVM加載的時候就創(chuàng)建好一個唯一的實例翘狱;以后都是用這個實例;同時,由于該實例在類被加載的時候就創(chuàng)建出來了砰苍,所以也避免了線程安全問題潦匈。

還有一種餓漢模式的變種:


這兩種方法都是在jvm加載類的時候就是實例對象;本質(zhì)是一樣的赚导;

由于餓漢模式是在類被加載的時候?qū)ο缶蜁嵗缢酢_@也許會造成不必要的消耗,因為有可能這個實例根本就不會被用到吼旧。而且凰锡,如果這個類被多次加載的話也會造成多次實例化。其實解決這個問題的方式有很多,下面提供兩種解決方式寡夹,第一種是使用靜態(tài)內(nèi)部類的形式处面。第二種是使用懶漢式厂置。


這種方式同樣利用了classloder的機(jī)制來保證初始化User時只有一個線程菩掏,它跟餓漢式不同的是(很細(xì)微的差別):餓漢式是只要User類被裝載了,那么user實例就會被實例化(沒有達(dá)到lazy loading效果)昵济,而這種方式是User類被裝載了智绸,instance不一定被初始化。因為UserSingleton類沒有被主動使用访忿,只有顯示通過調(diào)用Instance方法時瞧栗,才會顯示裝載UserSingleton類,從而實例化user海铆。想象一下迹恐,如果實例化user很消耗資源,我想讓他延遲加載卧斟,另外一方面殴边,我不希望在Singleton類加載時就實例化,因為我不能確保User類還可能在其他的地方被主動使用從而被加載珍语,那么這個時候?qū)嵗痷ser顯然是不合適的锤岸。這個時候,這種方式相比餓漢式更加合理板乙。


懶漢模式:

上面這種單例叫做懶漢式單例是偷。懶漢,就是不會提前把實例創(chuàng)建出來募逞,將類對自己的實例化延遲到第一次被引用的時候蛋铆。Instance方法的作用是希望該對象在第一次被使用的時候被new出來。

這種寫法能夠在多線程中很好的工作放接,而且看起來它也具備很好的延遲加載刺啦,但是,遺憾的是透乾,他效率很低洪燥,因為99%情況下不需要同步。(因為上面的synchronized的加鎖范圍是整個方法乳乌,該方法的所有操作都是同步進(jìn)行的捧韵,但是對于非第一次創(chuàng)建對象的情況,也就是沒有進(jìn)入if語句中的情況汉操,根本不需要同步操作再来,可以直接返回user。)


通過使用同步代碼塊的方式減小了鎖的范圍。這樣可以大大提高效率芒篷。(對于已經(jīng)存在user的情況搜变,無須同步,直接return)针炉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挠他,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子篡帕,更是在濱河造成了極大的恐慌殖侵,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镰烧,死亡現(xiàn)場離奇詭異拢军,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怔鳖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門茉唉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人结执,你說我怎么就攤上這事度陆。” “怎么了昌犹?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵坚芜,是天一觀的道長。 經(jīng)常有香客問我斜姥,道長鸿竖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任铸敏,我火速辦了婚禮缚忧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杈笔。我一直安慰自己闪水,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布蒙具。 她就那樣靜靜地躺著球榆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪禁筏。 梳的紋絲不亂的頭發(fā)上持钉,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機(jī)與錄音篱昔,去河邊找鬼每强。 笑死始腾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的空执。 我是一名探鬼主播浪箭,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辨绊!你這毒婦竟也來了奶栖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤邢羔,失蹤者是張志新(化名)和其女友劉穎驼抹,沒想到半個月后桑孩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拜鹤,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年流椒,在試婚紗的時候發(fā)現(xiàn)自己被綠了敏簿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡宣虾,死狀恐怖惯裕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绣硝,我是刑警寧澤蜻势,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站鹉胖,受9級特大地震影響握玛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甫菠,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一挠铲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寂诱,春花似錦拂苹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丘喻,卻和暖如春脯宿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仓犬。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工嗅绰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓窘面,卻偏偏與公主長得像翠语,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子财边,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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