單例

為什么需要單例泌霍?
  • 節(jié)省內(nèi)存和計(jì)算货抄,
  • 保證結(jié)果正確
  • 方便管理
適用場(chǎng)景
  • 無狀態(tài)的工具類:比如日志工具
  • 全局信息類

八種寫法

1. 餓漢式(靜態(tài)常量)[可用]

public class Singleton1 {
    //類加載的時(shí)候完成了實(shí)例化,對(duì)象就被創(chuàng)建初始化
    private final static Singleton1 INSTANCE = new Singleton1();
    //單例的構(gòu)造都是私有的
    private Singleton1() {
    }
    public static Singleton1 getInstance() {
        return INSTANCE;
    }
}

2. 餓漢式(靜態(tài)代碼塊)[可用]

public class Singleton2 {

    private final static Singleton2 INSTANCE;
    //只是將初始化的工作放在了靜態(tài)塊里朱转,歸根結(jié)底是一樣的蟹地,都是在類加載的時(shí)候完成了初始化
    static {
        INSTANCE = new Singleton2();
    }
    private Singleton2() {
    }
    public static Singleton2 getInstance() {
        return INSTANCE;
    }
}

3. 懶漢式(線程不安全)[不可用]

public class Singleton3 {
    private static Singleton3 instance;
    private Singleton3() {
    }
    public static Singleton3 getInstance() {
        if (instance == null) {
            instance = new Singleton3();
        }
        return instance;
    }
}

4. 懶漢式(線程安全,同步方法)[不推薦用]

public class Singleton4 {

    private static Singleton4 instance;

    private Singleton4() {

    }

    public synchronized static Singleton4 getInstance() {
        if (instance == null) {
            instance = new Singleton4();
        }
        return instance;
    }
}

5. 懶漢式(線程不安全藤为,同步代碼塊)[不可用]

public class Singleton5 {

    private static Singleton5 instance;

    private Singleton5() {

    }

    public static Singleton5 getInstance() {
        if (instance == null) {
            synchronized (Singleton5.class) {
                instance = new Singleton5();
            }
        }
        return instance;
    }
}

6. 懶漢式(雙重檢查) [推薦用]

  • 優(yōu)點(diǎn):線程安全怪与,延遲加載, 效率較高
  • 為什么要double-check?
    線程安全
    單check行不行缅疟?
    性能問題
  • 為什么要用volatile分别?
  1. 新建對(duì)象實(shí)際上有3個(gè)步驟,分配對(duì)象空間創(chuàng)建一個(gè)對(duì)象->然后執(zhí)行構(gòu)造方法初始化對(duì)象->然后把地址賦值給引用存淫,但是jvm和CPU可能會(huì)對(duì)這個(gè)過程重排序耘斩,導(dǎo)致,分配完對(duì)象的內(nèi)存空間纫雁,就賦值給引用煌往,這個(gè)時(shí)候如果還沒完成初始化,其他的線程拿到這個(gè)對(duì)象進(jìn)行操作就可能導(dǎo)致空指針異常轧邪。所以使用volatile可以禁止指令重排序避免這個(gè)問題刽脖,線程在任何時(shí)候取得的對(duì)象都是初始化完成的,就不會(huì)發(fā)生空指針忌愚。
public class Singleton6 {

    private volatile static Singleton6 instance;

    private Singleton6() {
    }

    public static Singleton6 getInstance() {
        if (instance == null) {
            synchronized (Singleton6.class) {
                if (instance == null) {
                    instance = new Singleton6();
                }
            }
        }
        return instance;
    }
}

7. 靜態(tài)內(nèi)部類[推薦用]

可以認(rèn)為是懶漢的一種

public class Singleton7 {

    private Singleton7() {
    }

    private static class SingletonInstance {
        //static 的屬性只在類加載的時(shí)候初始化一次
        private static final Singleton7 INSTANCE = new Singleton7();
    }

    public static Singleton7 getInstance() {
        //方法走到這里曲管,觸發(fā)加載SingletonInstance.class,從而初始化INSTANCE
        return SingletonInstance.INSTANCE;
    }
}

8. 枚舉[推薦用]

枚舉要少用硕糊,但是枚舉單例可以用院水,因?yàn)橹挥幸粋€(gè)對(duì)象

public enum Singleton8 {
    INSTANCE;

    public void whatever() {
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腊徙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子檬某,更是在濱河造成了極大的恐慌撬腾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恢恼,死亡現(xiàn)場(chǎng)離奇詭異民傻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)场斑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門漓踢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漏隐,你說我怎么就攤上這事喧半。” “怎么了青责?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵挺据,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我爽柒,道長(zhǎng)吴菠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任浩村,我火速辦了婚禮,結(jié)果婚禮上占哟,老公的妹妹穿的比我還像新娘心墅。我一直安慰自己,他們只是感情好榨乎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布怎燥。 她就那樣靜靜地躺著,像睡著了一般蜜暑。 火紅的嫁衣襯著肌膚如雪铐姚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天肛捍,我揣著相機(jī)與錄音隐绵,去河邊找鬼。 笑死拙毫,一個(gè)胖子當(dāng)著我的面吹牛依许,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缀蹄,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峭跳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼膘婶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛀醉,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤悬襟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拯刁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脊岳,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年筛璧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逸绎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夭谤,死狀恐怖棺牧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朗儒,我是刑警寧澤颊乘,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站醉锄,受9級(jí)特大地震影響乏悄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恳不,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一檩小、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烟勋,春花似錦规求、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沮尿,卻和暖如春丛塌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畜疾。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工赴邻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庸疾。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓乍楚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親届慈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徒溪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • 為什么說支持懶加載的雙重檢測(cè)不比餓漢式更優(yōu)臊泌? 單例設(shè)計(jì)模式(Singleton Design Pattern)理解...
    vannesspeng閱讀 232評(píng)論 0 0
  • 文章概要 1鲤桥、什么是單例2、為什么需要單例3渠概、單例的優(yōu)點(diǎn)和缺點(diǎn)4茶凳、單例的寫法和比較5、序列化破壞單例6播揪、反射破壞單...
    張先森丶閱讀 502評(píng)論 0 1
  • 一猪狈、前言 最近看了很多的書還有視頻箱沦,他們都花了很長(zhǎng)的篇幅提到了單例模式,于是我想把他們都總結(jié)起來雇庙,寫下這篇文章谓形。目...
    鄒瑾一閱讀 254評(píng)論 0 0
  • 什么是設(shè)計(jì)模式? 是一套被反復(fù)使用疆前、多數(shù)人知曉的寒跳、經(jīng)過分類的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)竹椒。一些開發(fā)的套路童太,用于解決某一些特...
    Spring618閱讀 660評(píng)論 0 0
  • 【寫在前面】各大技術(shù)網(wǎng)站有大量關(guān)于單例模式的文章,都大同小異胸完,本文也無特別之處康愤。僅作為一個(gè)筆記文檔方便自閱~~本文...
    尛尛蟲閱讀 152評(píng)論 0 0