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

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

定義

單例模式(singleton pattern)是確保一個類在任何情況下都絕對只有一個實例勉吻,并提供一個全局訪問點旅赢。

單例模式是創(chuàng)建型模式齿桃。

分類

1、餓漢式(餓漢和靜態(tài)餓漢)

2带污、懶漢式(線程安全要加鎖)

3香到、枚舉式(注冊)初始化即生成,餓漢式养渴,可以保證不被反射機(jī)制和反序列化破壞,是借助JDK的特性翘紊,所以最官方藐唠、最權(quán)威、最穩(wěn)定

4踪宠、序列化單例模式(可以解決反序列化問題妈嘹,但是內(nèi)存開銷依然很大)

5、容器式單例模式(容器式單例模式適用于需要大量創(chuàng)建單例對象的場景润脸,便于管理毙驯。但它是非線程安全的)

6、threadLocal單例模式(不能保證其創(chuàng)建的對象是全局唯一的爆价,但是能保證在單個線程中是唯一的,天生是線程安全的)

總結(jié)

????單例模式可以保證內(nèi)存中只有一個實例骤宣,減少了內(nèi)存開銷序愚,還可以避免對資源的多重占用。

單例模式的常見應(yīng)?場景

單例模式(Singleton)也叫單態(tài)模式活逆,是設(shè)計模式中最為簡單的?種模式拗胜,甚?有些模式?師都不稱其為模式,稱其為?種實現(xiàn)技巧锈遥,因為設(shè)計模式講究對象之間的關(guān)系的抽象勘畔,?單例模式只有???個對象,也因此有些設(shè)計?師并把把其稱為設(shè)計模式之?炫七。

好多沒怎么使?過的?可能會想万哪,單例模式感覺不怎么?到,實際的應(yīng)?場景有哪些呢奕巍?以下,我將列出?些就在咱們周邊和很有意義的單例應(yīng)?場景檩坚。

1. Windows的Task Manager(任務(wù)管理器)就是很典型的單例模式(這個很熟悉吧)诅福,想想看,是不是呢剩檀,你能打開兩個windows task manager嗎旺芽? 不信你??試試看哦~

2. windows的Recycle Bin(回收站)也是典型的單例應(yīng)?。在整個系統(tǒng)運?過程中运嗜,回收站?直維護(hù)著僅有的?個實例悯舟。

3. ?站的計數(shù)器,?般也是采?單例模式實現(xiàn)抵怎,否則難以同步。

4. 應(yīng)?程序的?志應(yīng)?尝艘,?般都何?單例模式實現(xiàn),這?般是由于共享的?志?件?直處于打開狀態(tài)秒际,因為只能有?個實例去操作狡汉,否則內(nèi)容不好追加。

5. Web應(yīng)?的配置對象的讀取寄锐,?般也應(yīng)?單例模式捻脖,這個是由于配置?件是共享的資源。

6. 數(shù)據(jù)庫連接池的設(shè)計?般也是采?單例模式沿癞,因為數(shù)據(jù)庫連接是?種數(shù)據(jù)庫資源矛渴。數(shù)據(jù)庫軟件系統(tǒng)中使?數(shù)據(jù)庫連接池,主要是節(jié)省打開或者關(guān)閉數(shù)據(jù)庫連接所引起的效率損耗蚕涤,這種效率上的損耗還是?常昂貴的铣猩,因為何?單例模式來維護(hù),就可以??降低這種損耗达皿。

7. 多線程的線程池的設(shè)計?般也是采?單例模式,這是由于線程池要?便對池中的線程進(jìn)?控制龄寞。

8. 操作系統(tǒng)的?件系統(tǒng)汤功,也是?的單例模式實現(xiàn)的具體例?,?個操作系統(tǒng)只能有?個?件系統(tǒng)色解。

9. HttpApplication 也是單位例的典型應(yīng)?。熟悉ASP.Net(IIS)的整個請求?命周期的?應(yīng)該知道HttpApplication也是單例模式在抛,所有的HttpModule都共享?個HttpApplication實例.

? 總結(jié)以上萧恕,不難看出:

單例模式應(yīng)?的場景?般發(fā)現(xiàn)在以下條件下:

(1)資源共享的情況下肠阱,避免由于資源操作時導(dǎo)致的性能或損耗等。如上述中的?志?件走趋,應(yīng)?配置噪伊。

(2)控制資源的情況下,?便資源之間的互相通信姨伟。如線程池等豆励。

單例模式優(yōu)點:

1、在內(nèi)存中只有一個實例技扼,減少了內(nèi)存開銷嫩痰。

2、可以避免資源的多重占用串纺。

3造垛、設(shè)置全局訪問點,嚴(yán)格控制訪問五辽。

單例模式的缺點:

1、沒有接口乡翅,擴(kuò)展困難

2尚洽、如果要擴(kuò)展單例對象靶累,只有修改代碼,沒有其他途徑潮酒。

代碼實例

1.1邪蛔、餓漢式單例模式:類加載時立即初始化,并且創(chuàng)建單例對象勃教。它絕對線程安全匠抗,在線程還沒出現(xiàn)就實例化了,不存在訪問安全問題心软。但是會導(dǎo)致內(nèi)存浪費.
1.2著蛙、餓漢式單例模式(靜態(tài)代碼塊):同第一種,唯一不同就是多點逼格O .O
2.1懶漢式單例模式,添加synchronized關(guān)鍵字后,解決了傳統(tǒng)懶漢模式的線程安全問題,但是每次都要獲取鎖,性能較低.
2.2懶漢式單例模式改進(jìn)(雙重檢查鎖):可以有效的提高運行效率,那么我們可不可以不使用鎖?
2.3懶漢式單例模式改進(jìn)(靜態(tài)內(nèi)部類):這種形式來兼顧餓漢式單例模式的內(nèi)存浪費問題和 synchronized 的性能問題(完美的屏蔽了這兩個缺點) ,它還可以防止被反射破壞單例機(jī)制.到目前為止,這種寫法基本上已經(jīng)是最牛的啦,,但是依然可以被反序列化破壞(逐漸開始杠精起來...)
3.1猎唁、枚舉類單例模式(屬于注冊式單例模式的一種):初始化即生成诫隅,餓漢式帐偎,可以保證不被反射機(jī)制和反序列化破壞,是借助JDK的特性削樊,所以最官方、最權(quán)威甸箱、最穩(wěn)定,因此枚舉式單例模式是《Effective java》書中推薦的一種單例模式實現(xiàn)方法豪嗽。
3.2豌骏、容器式單例模式(屬于注冊式單例模式的第2種):適用于需要大量創(chuàng)建單例對象的場景,便于管理变秦。但它是非線程安全的框舔。
4刘绣、序列化單例模式:反序列化導(dǎo)致單例模式被破壞挣输,加上readResolve方法,可以解決反序列化問題撩嚼,但是內(nèi)存開銷依然很大.
5完丽、線程單例實現(xiàn)ThreadLocal:不能保證其創(chuàng)建的對象是全局唯一的,但是能保證在單個線程中是唯一的蜻底,天生是線程安全的聘鳞。這個方式適合一些特定場景.

學(xué)習(xí)單例模式的知識重點總結(jié)

1、私有化構(gòu)造器

2站楚、保證線程安全

單例模式可以保證內(nèi)存里只有一個實例搏嗡,減少了內(nèi)存的開銷,還可以避免對資源的多重占用。單例模式看起來非常簡單舅踪,實現(xiàn)起來其實也非常簡單良蛮,但是在面試中卻是一個高頻面試點。希望“小伙伴們”通過本章的學(xué)習(xí)货徙,對單例模式有了非常深刻的認(rèn)識皮胡,在面試中彰顯技術(shù)深度,提升核心競爭力蠢棱,給面試加分甩栈,順利拿到錄取通知(Offer)。

擴(kuò)展

1量没、解決容器式單例的線程安全問題殴蹄。

兩種方法:雙重檢查鎖,利用ConcurrentHashMap#putIfAbsent()方法的原子性袭灯。

public class ContainerSingleton {

????private static Map ioc = new ConcurrentHashMap();

????private ContainerSingleton() {

? ? ? ? ????throw new RuntimeException("不可被實例化稽荧!");

????}

? ? // 方法一:雙重檢查鎖

????public static Object getInstance(String className) {

????????Object instance = null;

????????if (!ioc.containsKey(className)) {

????????????synchronized (ContainerSingleton.class) {

????????????????if (!ioc.containsKey(className)) {

????????????????????try {

????????????????????????instance = Class.forName(className).newInstance();

????????????????????????ioc.put(className, instance);

? ? ? ? ? ? ? ? ? ? } catch (Exception e) {

????????????????????????e.printStackTrace();

????????????????????}

????????????????return instance;

????????????????} else {

????????????????????return ioc.get(className);

????????????????}

????????????}

????????}

????????return ioc.get(className);

????}

? ? // 方法二:利用ConcurrentHashMap#putIfAbsent()方法的原子性

public static Object getInstance1(String className){

????Object instance = null;

????try {

????????ioc.putIfAbsent(className, Class.forName(className).newInstance());

????}catch (Exception e){

????????e.printStackTrace();

????}

????return ioc.get(className);

????}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛤克,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子髓介,更是在濱河造成了極大的恐慌筋现,老刑警劉巖箱歧,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呀邢,死亡現(xiàn)場離奇詭異豹绪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瞒津,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門巷蚪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屁柏,你說我怎么就攤上這事淌喻。” “怎么了似嗤?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵烁落,是天一觀的道長豌注。 經(jīng)常有香客問我,道長每聪,這世上最難降的妖魔是什么齿风? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮童本,結(jié)果婚禮上脸候,老公的妹妹穿的比我還像新娘绑蔫。我一直安慰自己泵额,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布篓叶。 她就那樣靜靜地躺著亡资,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗦董。 梳的紋絲不亂的頭發(fā)上瘦黑,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音匹摇,去河邊找鬼甲葬。 笑死,一個胖子當(dāng)著我的面吹牛坡垫,可吹牛的內(nèi)容都是我干的画侣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼溉卓,長吁一口氣:“原來是場噩夢啊……” “哼搬泥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忿檩,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤休溶,失蹤者是張志新(化名)和其女友劉穎扰她,沒想到半個月后芭碍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年鸳吸,在試婚紗的時候發(fā)現(xiàn)自己被綠了速勇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡养匈,死狀恐怖都伪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陨晶,我是刑警寧澤先誉,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響撮躁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杨帽,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一嗤军、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧老客,春花似錦、人聲如沸胧砰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哲嘲。三九已至,卻和暖如春画切,著一層夾襖步出監(jiān)牢的瞬間侦啸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工庞萍, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留忘闻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓私恬,卻偏偏與公主長得像炼吴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荣德,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355