Java單例模式

單例模式


一.單例模式介紹

單例模式是Java二十三種設(shè)計(jì)模式中的一種家破,也是一種比較常用的設(shè)計(jì)模式族沃。其作用是保證該類只能擁有一個(gè)實(shí)例對(duì)象。

二.實(shí)現(xiàn)步驟

1.私有化該類的構(gòu)造方法,讓其他類無法通過構(gòu)造器創(chuàng)建該類的實(shí)例拟蜻。
2.提供可以獲取到該類實(shí)例的靜態(tài)方法篓冲,讓其他類通過該方法獲取到該類的實(shí)例龄广。

三.寫法介紹

1.餓漢式

1.1 介紹

因?yàn)樵擃惖膶?shí)例是在類加載的時(shí)候就創(chuàng)建出來的蒲讯,并不是在使用的時(shí)候。就像被餓了很久的人見到吃的刚操,不管三七二十一闸翅,先填飽肚子再說。所以把這種寫法叫做餓漢式菊霜。

1.2 Java代碼

    public class Test{
        //本類持有本類的引用
        private static Test mInstance = new Test();
        
        //將構(gòu)造方法私有化
        private Test(){
        
        }
        
        //提供一個(gè)對(duì)外的方法獲取本類的引用
        public static Test getInstance(){
            return mInstance;
        }
    }

1.3 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):寫法簡單坚冀,線程安全,避免了線程同步的問題鉴逞。
缺點(diǎn):因?yàn)閷?shí)例是在類加載的時(shí)候初始化记某,所以它的生命周期是和類相同。即使它從未被用到构捡,也不會(huì)被系統(tǒng)回收液南,造成內(nèi)存的浪費(fèi)。
可以但是不推薦使用餓漢式勾徽。

2.懶漢式(基本寫法)

2.1 介紹

該寫法是只有在使用的時(shí)候才進(jìn)行實(shí)例創(chuàng)建滑凉。就像一個(gè)懶漢只有當(dāng)餓了的時(shí)候才去吃飯。

2.2 Java代碼

    public class Test{
        private static Test mInstance;
        
        private Test(){
        }
        
        public static Test getInstance(){
            if(null = mInstance){
                mInstance = new Test();
            }
            return mInstance;
        }
    }

2.3 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):當(dāng)使用的時(shí)候才進(jìn)行實(shí)例化喘帚,不會(huì)造成內(nèi)存的浪費(fèi)畅姊。起到了Lazy Loading的效果。
缺點(diǎn):在單線程該寫法沒有問題吹由。但是在多線程情況下若未,是線程不安全的。
不推薦使用該寫法倾鲫。

3.懶漢式(同步方法)

3.1 介紹

為了解決懶漢式的線程不安全問題粗合,把getInstance()方法進(jìn)行線程同步。

3.2 Java代碼

    public class Test{
        private static Test mInstance;
        
        private Test(){
        
        }
        
        public static synchronized Test getInstance(){
            if(null == mInstance){
                mInstance = new Test();
            }
            return mInstance;
        }
    
    }

*3.3 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):解決了線程安全問題乌昔。
缺點(diǎn):同步效率低隙疚。每次調(diào)用getInstance方法時(shí)都要進(jìn)行同步。但實(shí)際上只有當(dāng)mInstance == null時(shí)才有同步的必要磕道,不為null時(shí)直接return就OK了甚淡。
不推薦使用。

4.懶漢式(同步代碼塊)

4.1 介紹

為了解決同步方法效率低而產(chǎn)生的寫法。

4.2 代碼

    public class Test{
        private static Test mInstance;
        
        private Test(){
        
        }
        
        public static Test getInstance(){
            if(null == mInstance){
                synchronized(Test.class){
                    mInstance = new Test();
                }
            }
            return mInstance;
        }
        
    }

4.3 優(yōu)缺點(diǎn)

和傳統(tǒng)的懶漢式基本沒區(qū)別贯卦。都是線程不安全。
不推薦使用焙贷。

5.懶漢式(雙重檢查)

5.1 介紹

在同步方法的基礎(chǔ)上再進(jìn)行改良的撵割。

5.2

    public class Test{
        private static volatile Test mInstance;
        
        private Test(){
        
        }
        
        public static Test getInstance(){
            if(null == mInstance){
                synchronized(Test.class){
                    if(null == mInstance){
                        Test = new Test();
                    }
                }
            }
            return mInstance;
        }
    }

5.3 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):這種懶漢式的寫法用到了Double-Check。進(jìn)行了兩次非空判斷辙芍,保證了線程安全啡彬,并且只實(shí)例化的一次代碼。該寫法線程安全故硅,延遲加載庶灿,效率高。
缺點(diǎn):無吃衅。
推薦使用往踢。

6.靜態(tài)內(nèi)部類

6.1 介紹

靜態(tài)內(nèi)部類跟餓漢式方式采用的機(jī)制類似,但又不同徘层。兩者都是采用了類裝載的機(jī)制來保證初始化實(shí)例時(shí)只有一個(gè)線程峻呕。不同的是餓漢式在類被裝載時(shí)被實(shí)例化,沒有Lazy Loading的作用趣效。而靜態(tài)內(nèi)部類方式在類被裝載時(shí)并不會(huì)實(shí)例化瘦癌,而是在需要實(shí)例化時(shí),才會(huì)調(diào)用跷敬。

6.2 代碼

    public class Test{
        private Test(){
        
        }
        
        private static class SingletonInstance{
            private static final Test INSTANCE = new Test();
        }
        
        public static Test getInstance(){
            return SingletonInstance.INSTANCE;
        }
    
    }

6.3 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):利用類的靜態(tài)屬性保證唯一性讯私,JVM保證線程安全,延遲加載西傀,效率高斤寇。
推薦使用。

7.枚舉

7.1 代碼

    public enum Test{
        INSTANCE;
        public void whateverMethod(){
        
        }
    }

本文章參考了CSDN的博客池凄,這是去往該作者的 鏈接.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抡驼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肿仑,更是在濱河造成了極大的恐慌致盟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尤慰,死亡現(xiàn)場離奇詭異馏锡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伟端,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門杯道,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人责蝠,你說我怎么就攤上這事党巾∥ィ” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵齿拂,是天一觀的道長驳规。 經(jīng)常有香客問我,道長署海,這世上最難降的妖魔是什么吗购? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮砸狞,結(jié)果婚禮上捻勉,老公的妹妹穿的比我還像新娘。我一直安慰自己刀森,他們只是感情好踱启,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撒强,像睡著了一般禽捆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上飘哨,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天胚想,我揣著相機(jī)與錄音,去河邊找鬼芽隆。 笑死浊服,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胚吁。 我是一名探鬼主播牙躺,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腕扶!你這毒婦竟也來了孽拷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤半抱,失蹤者是張志新(化名)和其女友劉穎脓恕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窿侈,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炼幔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了史简。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃秀。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跺讯,到底是詐尸還是另有隱情枢贿,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布抬吟,位于F島的核電站萨咕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏火本。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一聪建、第九天 我趴在偏房一處隱蔽的房頂上張望钙畔。 院中可真熱鬧,春花似錦金麸、人聲如沸擎析。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揍魂。三九已至,卻和暖如春棚瘟,著一層夾襖步出監(jiān)牢的瞬間现斋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工偎蘸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庄蹋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓迷雪,卻偏偏與公主長得像限书,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子章咧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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