Java單例模式的五種實現(xiàn)方式

1.單例模式(Singleton Pattern)是 Java 中最簡單的設(shè)計模式之一。
這種類型的設(shè)計模式屬于創(chuàng)建型模式载碌,它提供了一種創(chuàng)建對象的最佳方式猜嘱。

這種模式涉及到一個單一的類,該類負責(zé)創(chuàng)建自己的對象嫁艇,同時確保只有單個對象被創(chuàng)建朗伶。
這個類提供了一種訪問其唯一的對象的方式,可以直接訪問步咪,不需要實例化該類的對象论皆。

目的:保證一個類有且僅有一個實例,并提供一個訪問它的全局訪問點猾漫。
解決問題:管理一個被高頻率使用的類点晴,被頻繁的創(chuàng)建和銷毀。只用單例能更好的節(jié)省程序執(zhí)行時間和減少空間內(nèi)存的使用悯周。

單例模式的實現(xiàn)方式有很多種:懶漢式粒督,餓漢式,雙鎖機制實現(xiàn)禽翼,內(nèi)部類形式屠橄,枚舉類形式;
最著名的就是:懶漢式和餓漢式捐康。
他們各有各的特點仇矾,也各有各的缺點。

2.餓漢式

/**

  • 餓漢式 線程安全解总,運行高效贮匕,但長時間占用內(nèi)存。
    */
    public class SingletonDemo1 {
    private static SingletonDemo1 instance = new SingletonDemo1();

    private SingletonDemo1() {
    System.out.print("創(chuàng)建了:SingletonDemo1");
    }

    public static SingletonDemo1 getInstance(){
    return instance;
    }
    public void eventOperation(){
    System.out.print("創(chuàng)建了:SingletonDemo1執(zhí)行了eventOperation");
    }
    }

3.懶漢式

/**

  • 懶漢式 運行耗時花枫,內(nèi)存占用少刻盐,即用即建。有兩種實現(xiàn)方式
    */
    public class SingletonDemo2 {
    private static SingletonDemo2 instance;
    private SingletonDemo2() {
    System.out.print("創(chuàng)建了:SingletonDemo2");
    }
/**
 * 線程安全 多線程使用安全劳翰。synchronized作用域為getInstance敦锌,每次同步都要面對同步問題,小有耗時佳簸。
 * @return
 */
public static synchronized SingletonDemo2 getInstance() {
    if (null == instance) {
        instance = new SingletonDemo2();
    }
    return instance;
}


/**
 * 線程不安全  多線程使用會重復(fù)創(chuàng)建
 * @return
 */
public static SingletonDemo2 getInstance1(){
    if (null == instance) {
        instance = new SingletonDemo2();
    }
    return instance;
}

public void eventOperation(){
    System.out.print("創(chuàng)建了:SingletonDemo2  執(zhí)行了  eventOperation");
}

}

4.雙重鎖機制單例模式

/**

  • 雙重鎖機制單例模式乙墙,基于懶漢式發(fā)展而來。雙重鎖機制單例模式其實就是雙重檢查鎖定習(xí)語下的懶漢式生均。所以從本質(zhì)上來說還是懶漢式听想。
  • 雙重鎖機制,是指雙重檢查+同步鎖機制马胧。在懶漢式的基礎(chǔ)上能更好的提高時效和空間使用汉买,但是并不能從根本上解決多線程創(chuàng)建問題。原因是jvm的內(nèi)從模型導(dǎo)致雙重檢查和同步鎖失效佩脊。
  • 失效的原因是jvm的無序?qū)懭雴栴}蛙粘。所以不建議使用此方式進行單例模式的創(chuàng)建垫卤。
    /
    public class SingletonDCL {
    private volatile static SingletonDCL instance;
    private SingletonDCL() {
    System.out.print("創(chuàng)建了:SingletonDCL");
    }
    public static SingletonDCL getInstance(){
    /
    *
    * 檢查1
    /
    if (null == instance) {
    /
    *
    * 同步鎖,作用域是創(chuàng)建對象
    /
    synchronized (SingletonDCL.class){
    /
    *
    * 檢查2
    */
    if (null == instance) {
    instance = new SingletonDCL();
    }
    }
    }
    return instance;
    }
    public void eventOperation(){
    System.out.print("創(chuàng)建了:SingletonDCL執(zhí)行了eventOperation");
    }
    }

5.內(nèi)部類創(chuàng)建方式

/**

  • 內(nèi)部類創(chuàng)建方式 線程安全出牧,調(diào)用效率高穴肘,可以延時加載,但是靜態(tài)內(nèi)部類有個通病崔列,就是內(nèi)存泄漏問題梢褐。
    */
    public class SingletonDemo3 {

    private static final SingletonDemo3 instance = new SingletonDemo3();

    private SingletonDemo3() {
    System.out.print("創(chuàng)建了:SingletonDemo3");
    }

    public static SingletonDemo3 getInstance(){
    return SingletonDemo3.instance;
    }
    public void eventOperation(){
    System.out.print("創(chuàng)建了:SingletonDemo3執(zhí)行了eventOperation");
    }
    }

6.枚舉類方式
/**

  • 枚舉類方式 穩(wěn)定旺遮,安全赵讯,簡單優(yōu)雅,但是不可繼承耿眉,擴展性差边翼;
    */
    public enum SingletonEnum {
    INSTANCE;
    public void eventOperation(){
    System.out.print("創(chuàng)建了:SingletonEnum執(zhí)行了eventOperation");

    }
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸣剪,隨后出現(xiàn)的幾起案子组底,更是在濱河造成了極大的恐慌,老刑警劉巖筐骇,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件债鸡,死亡現(xiàn)場離奇詭異,居然都是意外死亡铛纬,警方通過查閱死者的電腦和手機厌均,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來告唆,“玉大人棺弊,你說我怎么就攤上這事∏苄” “怎么了模她?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長懂牧。 經(jīng)常有香客問我侈净,道長,這世上最難降的妖魔是什么僧凤? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任畜侦,我火速辦了婚禮,結(jié)果婚禮上拼弃,老公的妹妹穿的比我還像新娘夏伊。我一直安慰自己,他們只是感情好吻氧,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布溺忧。 她就那樣靜靜地躺著咏连,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲁森。 梳的紋絲不亂的頭發(fā)上祟滴,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音歌溉,去河邊找鬼垄懂。 笑死,一個胖子當(dāng)著我的面吹牛痛垛,可吹牛的內(nèi)容都是我干的草慧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼匙头,長吁一口氣:“原來是場噩夢啊……” “哼漫谷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹂析,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤舔示,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后电抚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惕稻,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年蝙叛,在試婚紗的時候發(fā)現(xiàn)自己被綠了俺祠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡甥温,死狀恐怖锻煌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姻蚓,我是刑警寧澤宋梧,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站狰挡,受9級特大地震影響捂龄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜加叁,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一倦沧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧它匕,春花似錦展融、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扑浸。三九已至,卻和暖如春燕偶,著一層夾襖步出監(jiān)牢的瞬間喝噪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工指么, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酝惧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓伯诬,卻偏偏與公主長得像晚唇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姑廉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344