設(shè)計(jì)模式一:?jiǎn)卫J?/h1>

八種寫(xiě)法:

1)餓漢式(靜態(tài)常量)
2)餓漢式(靜態(tài)代碼塊)
3)懶漢式(線程不安全)
4)懶漢式(線程安全紊婉,同步方法)
5)懶漢式(線程安全辕宏,同步代碼塊)
6)雙重檢查
7)靜態(tài)內(nèi)部類
8)枚舉

餓漢式:在類加載的時(shí)候就創(chuàng)建實(shí)例對(duì)象,沒(méi)有節(jié)約內(nèi)存宇智。
懶漢式:在使用的時(shí)候才去創(chuàng)建實(shí)例對(duì)象蔓搞,節(jié)省了內(nèi)存。
---------------------------------------------------------------

1)餓漢式(靜態(tài)常量)

public class SingletonOne {

    private SingletonOne(){}

    private final static SingletonOne instance = new SingletonOne();

    public static SingletonOne getInstance() {
        return instance;
    }

}
優(yōu)點(diǎn):寫(xiě)法簡(jiǎn)單随橘,在類加載的時(shí)候就完成了實(shí)例化喂分。避免了線程同步問(wèn)題。
缺點(diǎn):在類加載的時(shí)候就完成了實(shí)例化机蔗,沒(méi)有達(dá)到懶加載的效果蒲祈。
android中的application中可以使用此種方式。(實(shí)例化時(shí)要在onCreate()方法中進(jìn)行)
---------------------------------------------------------------

2)餓漢式(靜態(tài)代碼塊)

public class SingletonTwo {

    private SingletonTwo(){}

    private static SingletonTwo instance;

    static {
        instance = new SingletonTwo();
    }

    public static SingletonTwo getInstance() {
        return instance;
    }
}
優(yōu)缺點(diǎn)同第一種寫(xiě)法
---------------------------------------------------------------

3)懶漢式(線程不安全)

public class SingletonThree {

    private static SingletonThree instance;

    private SingletonThree(){}

    /**
     * 只有在用的時(shí)候才調(diào)用這個(gè)方法萝嘁,才會(huì)創(chuàng)建實(shí)例對(duì)象
     */
    public static SingletonThree getInstance() {
        if(instance == null) {
            // 多線程情景下梆掸,會(huì)有多個(gè)線程執(zhí)行到此處
            instance = new SingletonThree();
        }
        return instance;
    }
}
優(yōu)點(diǎn):懶加載
缺點(diǎn):線程不安全
可以在確保是單線程的場(chǎng)景下使用
---------------------------------------------------------------

4)懶漢式(線程安全,但是速度慢)

public class SingletonFour {

    private static SingletonFour instance;

    private SingletonFour(){}

    /**
     * 加入synchronized后牙言,每次調(diào)用都會(huì)同步酸钦,所以速度慢
     */
    public static synchronized SingletonFour getInstance() {
        if(instance == null) {
            instance = new SingletonFour();
        }
        return instance;
    }
}
優(yōu)點(diǎn):懶加載,線程安全
缺點(diǎn):速度慢
不推薦使用
---------------------------------------------------------------

5)懶漢式(線程不安全咱枉,同步代碼塊)

public class SingletonFive {

    private static SingletonFive instance;

    private SingletonFive(){}

    public static SingletonFive getInstance() {
        if(instance == null) {
            // 多線程情景下卑硫,還是會(huì)有多個(gè)線程進(jìn)入到這行,只不過(guò)會(huì)并行而已
            synchronized (SingletonFive.class) {
                instance = new SingletonFive();
            }
        }
        return instance;
    }
}
優(yōu)點(diǎn):懶加載
缺點(diǎn):線程不安全
不推薦使用
---------------------------------------------------------------

6)雙重檢查

public class SingleonSix {

    private static volatile SingleonSix instance;

    private SingleonSix(){}

    public static SingleonSix getInstance() {
        if(instance == null) {
            // 多線程場(chǎng)景下蚕断,會(huì)有多個(gè)線程進(jìn)入到這行欢伏,但是下一行只有第一個(gè)能進(jìn)去
            synchronized (SingleonSix.class) {
                if(instance == null) {
                    instance = new SingleonSix();
                }
            }
        }
        return instance;
    }
}
優(yōu)點(diǎn):懶加載,線程安全亿乳,速度較快
推薦使用
---------------------------------------------------------------

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

public class SingleonSeven {

    private SingleonSeven(){}

    private static class SingletonInstance {
        private static final SingleonSeven INSTANCE = new SingleonSeven();
    }

    public static SingleonSeven getInstance() {
        return SingletonInstance.INSTANCE;
    }
}
說(shuō)明:采用類加載的機(jī)制來(lái)保證初始化實(shí)例時(shí)只有一個(gè)線程硝拧。靜態(tài)內(nèi)部類SingletonInstance 在類SingleonSeven裝載的時(shí)候不會(huì)立即實(shí)例化。只有調(diào)用getInstance()方法時(shí)才會(huì)實(shí)例化葛假。類的靜態(tài)屬性只有在第一次加載類的時(shí)候才初始化障陶。這樣JVM保證了線程的安全,在類進(jìn)行初始化時(shí)桐款,別的線程是無(wú)法進(jìn)入的咸这。
線程安全,懶加載魔眨,推薦使用
---------------------------------------------------------------

8)枚舉

public enum SingleonEight {
    
    INSTANCE;

    public void sayHello() {
        System.out.println("hello");
    }
}
說(shuō)明: 枚舉是確保單例的媳维。
---------------------------------------------------------------

jdk源碼中的單例使用舉例:Runtime .java

public class Runtime {
    private static Runtime currentRuntime = new Runtime();

    /**
     * Returns the runtime object associated with the current Java application.
     * Most of the methods of class <code>Runtime</code> are instance
     * methods and must be invoked with respect to the current runtime object.
     *
     * @return  the <code>Runtime</code> object associated with the current
     *          Java application.
     */
    public static Runtime getRuntime() {
        return currentRuntime;
    }

    /** Don't let anyone else instantiate this class */
    private Runtime() {}
    ......
}

Android源碼中的使用:WindowManagerService .java

public class WindowManagerService extends IWindowManager.Stub
            implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {

        //......

        private static WindowManagerService sInstance;
        static WindowManagerService getInstance() {
            return sInstance;
        }

        public static WindowManagerService main(final Context context, final InputManagerService im,
                                                final boolean haveInputMethods, final boolean showBootMsgs, final boolean onlyCore,
                                                WindowManagerPolicy policy) {
            DisplayThread.getHandler().runWithScissors(() ->
                    sInstance = new WindowManagerService(context, im, haveInputMethods, showBootMsgs,
                            onlyCore, policy), 0);
            return sInstance;
        }
        //......
    }
總結(jié):
單例模式保證了系統(tǒng)內(nèi)存中只存在該類的一個(gè)對(duì)象酿雪,節(jié)省了系統(tǒng)資源,對(duì)于一些需要頻繁創(chuàng)建銷毀的對(duì)象侄刽,使用單例模式可以提高系統(tǒng)性能指黎。
---------------------------------------------------------------
單例模式和靜態(tài)方法的場(chǎng)景:
一般靜態(tài)方法都是沒(méi)有任何其他的外部屬性,只是一個(gè)工具類中的方法州丹。而單例是需要外部屬性的醋安。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市墓毒,隨后出現(xiàn)的幾起案子吓揪,更是在濱河造成了極大的恐慌,老刑警劉巖所计,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異主胧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)踪栋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)夷都,“玉大人眷唉,你說(shuō)我怎么就攤上這事∠崞疲” “怎么了荣瑟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)笆焰。 經(jīng)常有香客問(wèn)我劫谅,道長(zhǎng),這世上最難降的妖魔是什么嚷掠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮不皆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘能犯。我一直安慰自己,他們只是感情好踩晶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著术吝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪排苍。 梳的紋絲不亂的頭發(fā)上学密,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音幔翰,去河邊找鬼。 笑死遗增,一個(gè)胖子當(dāng)著我的面吹牛款青,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抡草,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼康震,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼燎含!你這毒婦竟也來(lái)了腿短?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赴魁,失蹤者是張志新(化名)和其女友劉穎钝诚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凝颇,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秉继,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年尚辑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盔腔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弛随,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栓票,到底是詐尸還是另有隱情愕够,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布惑芭,位于F島的核電站,受9級(jí)特大地震影響逃沿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凯亮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一哄尔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧置谦,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)签餐。三九已至,卻和暖如春氯檐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冠摄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工几缭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人年栓。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓某抓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親否副。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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

  • 1.引言 單例設(shè)計(jì)模式(Singleton Pattern)是最簡(jiǎn)單且常見(jiàn)的設(shè)計(jì)模式之一负甸,在它的核心結(jié)構(gòu)中只包含一...
    少年java菌閱讀 322評(píng)論 0 3
  • 一痹届、基本定義 通過(guò)上面簡(jiǎn)單介紹,我們可以對(duì)單例模式有一個(gè)簡(jiǎn)單的認(rèn)識(shí)蚕捉。所謂單例模式就是確保某一個(gè)類只有一個(gè)實(shí)例,...
    這一刻_776b閱讀 361評(píng)論 0 0
  • 單例模式迫淹,是特別常見(jiàn)的一種設(shè)計(jì)模式为严,因此我們有必要對(duì)它的概念和幾種常見(jiàn)的寫(xiě)法非常了解,而且這也是面試中常問(wèn)的知識(shí)點(diǎn)...
    煙雨星空閱讀 221評(píng)論 0 0
  • 定義概述: 單例模式是設(shè)計(jì)模式中一種应民,它的要求是單例模式實(shí)現(xiàn)的類,必須保證全局中只能實(shí)例出一個(gè)對(duì)象诲锹,即在全局中只能...
    linjiajiam閱讀 464評(píng)論 0 0
  • 單例模式 單例模式定義 確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例黄虱,這個(gè)類稱為單例類,它提供...
    戴先森Davi閱讀 312評(píng)論 0 3