單例模式的理解

單例設(shè)計(jì)模式:

某個(gè)類在整個(gè)系統(tǒng)中只能有一個(gè)實(shí)例,對(duì)象可被獲取和使用的代碼模式肴焊。
例如:代表jvm運(yùn)行環(huán))境的Runtime類
單例模式共有的特點(diǎn):1)構(gòu)造器私有化 2) 有個(gè)靜態(tài)變量去保存 3)提供方法區(qū)獲取這個(gè)變量

單例模式分為懶漢式和餓漢式。下面分別介紹懶漢式和餓漢式的幾種寫法。

餓漢式第一種(jdk1.5之前):

public class Singleton1 {

    public final static Singleton1 INSTANCE = new Singleton1();
    private Singleton1(){
    }
}

我們可以直接使用Singleton1.INSTANCE 就可以獲取到這個(gè)單例對(duì)象。

餓漢式第二種(jdk1.5之后)打颤,枚舉:

public enum Singleton2 {
    INSTANCE;
}

我們可以直接使用Singleton2.INSTANCE 就可以獲取到這個(gè)單例對(duì)象。枚舉的構(gòu)造器默認(rèn)就為私有的宛畦,所以滿足我們的條件瘸洛。

餓漢式第三種揍移,使用靜態(tài)代碼塊初始化

public class Singleton3 {

    public final  static Singleton3 INSTANCE;
    private   String info;
    static {
        Properties properties = new Properties();
        try {
            properties.load(Singleton3.class.getClassLoader().getResourceAsStream("info.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }

         String mStr  = (String) properties.get("info");
        INSTANCE = new Singleton3();
        INSTANCE.setInfo(mStr);
    }
    private Singleton3(){

    }
    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return super.toString();
    }
}

這種適用于有些變量需要在單例對(duì)象前初始化次和。
餓漢式不涉及到線程安全問(wèn)題,因?yàn)轲I漢式都是在類初始化的時(shí)候初始化類變量那伐,類加載機(jī)制可以避免線程安全問(wèn)題踏施。

懶漢式(延遲加載)

懶漢式第一種(線程不安全):

public class Singleton4 {

    private static  Singleton4 instance ;

    private Singleton4(){

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

調(diào)用類的getInstance方法即可獲取到單例對(duì)象。
懶漢式第二種(線程安全):

public class Singleton5 {

    private static Singleton5 instance ;

    private Singleton5(){

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

為代碼塊加上同步鎖罕邀,來(lái)保證線程安全畅形。
懶漢式第三種(線程安全,使用內(nèi)部類)

/*
 * 在內(nèi)部類被加載和初始化時(shí)诉探,才創(chuàng)建INSTANCE實(shí)例對(duì)象
 * 靜態(tài)內(nèi)部類不會(huì)自動(dòng)隨著外部類的加載和初始化而初始化日熬,它是要單獨(dú)去加載和初始化的。
 * 因?yàn)槭窃趦?nèi)部類加載和初始化時(shí)肾胯,創(chuàng)建的竖席,因此是線程安全的
 */
public class Singleton6 {
    private Singleton6(){

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

這種方法看起來(lái)代碼更為簡(jiǎn)潔,且利用類加載機(jī)制來(lái)保證了線程的安全敬肚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毕荐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子艳馒,更是在濱河造成了極大的恐慌憎亚,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異第美,居然都是意外死亡蝶锋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門什往,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牲览,“玉大人,你說(shuō)我怎么就攤上這事恶守〉谙祝” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵兔港,是天一觀的道長(zhǎng)庸毫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)衫樊,這世上最難降的妖魔是什么飒赃? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮科侈,結(jié)果婚禮上载佳,老公的妹妹穿的比我還像新娘。我一直安慰自己臀栈,他們只是感情好蔫慧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著权薯,像睡著了一般姑躲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盟蚣,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天黍析,我揣著相機(jī)與錄音,去河邊找鬼屎开。 笑死阐枣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奄抽。 我是一名探鬼主播蔼两,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼如孝!你這毒婦竟也來(lái)了宪哩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤第晰,失蹤者是張志新(化名)和其女友劉穎锁孟,沒(méi)想到半個(gè)月后彬祖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡品抽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年储笑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圆恤。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡突倍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盆昙,到底是詐尸還是另有隱情羽历,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布淡喜,位于F島的核電站秕磷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏炼团。R本人自食惡果不足惜澎嚣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘟芝。 院中可真熱鬧易桃,春花似錦、人聲如沸锌俱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嚼鹉。三九已至贩汉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锚赤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工褐鸥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留线脚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓叫榕,卻偏偏與公主長(zhǎng)得像浑侥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晰绎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 單例的作用 :個(gè)人的理解就是內(nèi)存地址只分配一次寓落,不管你是在主線程調(diào)用還是在子線程調(diào)用,方便我們使用的某個(gè)對(duì)象 荞下。比...
    目前運(yùn)行時(shí)閱讀 401評(píng)論 3 4
  • 1 場(chǎng)景問(wèn)題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個(gè)應(yīng)用伶选,讀取配置文件的內(nèi)容史飞。 很多應(yīng)用項(xiàng)目,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,674評(píng)論 12 68
  • 1.單例模式概述 (1)引言 單例模式是應(yīng)用最廣的模式之一仰税,也是23種設(shè)計(jì)模式中最基本的一個(gè)构资。本文旨在總結(jié)通過(guò)Ja...
    曹豐斌閱讀 2,888評(píng)論 6 47
  • 概念 確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化陨簇,并向整個(gè)系統(tǒng)提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)吐绵,這個(gè)類稱為單例類。 特性 ...
    野狗子嗷嗷嗷閱讀 541評(píng)論 0 2
  • 在Java中河绽,單例模式分為很多種己单,本人所了解的單例模式有以下幾種,如有不全還請(qǐng)大家留言指點(diǎn): 餓漢式 懶漢式/Do...
    Duang了個(gè)Duang閱讀 1,393評(píng)論 0 2