設(shè)計(jì)模式01——單例模式(懶漢和餓漢)

單例模式介紹

單例模式:?jiǎn)卫J綄儆诠S模式的特例,只是它不需要輸入?yún)?shù)并且始終返回同一對(duì)象的引用锣枝。單例模式能夠保證某一類型對(duì)象在系統(tǒng)中的唯一性,即某類在系統(tǒng)中只有一個(gè)實(shí)例。

單例模式中的兩種模式介紹

1.懶漢模式:顧名思義零远,他是一個(gè)懶漢,不愿動(dòng)彈烤宙。只有你主動(dòng)叫他的時(shí)候他才會(huì)工作遍烦,也就是說(shuō)實(shí)例在類加載的時(shí)候不被初始化,到了需要使用的時(shí)候才會(huì)進(jìn)行初始化躺枕。

2.餓漢模式:顧名思義服猪,他是一個(gè)餓漢供填,他很勤快就怕自己餓著。他總是先把食物準(zhǔn)備好罢猪,什么時(shí)候需要吃了近她,他隨時(shí)拿來(lái)吃,不需要臨時(shí)去搞食物膳帕。因此餓漢模式下實(shí)例在類加載時(shí)就完成了初始化粘捎,但是加載比較慢,獲取對(duì)象比較快危彩。

懶漢模式代碼實(shí)現(xiàn)

public class LazybonesSingleton {
    //默認(rèn)不會(huì)實(shí)例化攒磨,什么時(shí)候用就什么時(shí)候new
    private volatile static LazybonesSingleton instance = null;

    private LazybonesSingleton() {

    }

    public static LazybonesSingleton getInstance() {
        if (instance == null) {
            //什么時(shí)候用就什么時(shí)候new
            synchronized (LazybonesSingleton.class) {
                //使用雙檢查機(jī)制確保instance不為空時(shí)候只會(huì)被同步鎖一次,減少使用鎖的消耗汤徽,
                //而且保證instance只會(huì)被new一次娩缰,
                if (instance == null) {
                    instance = new LazybonesSingleton();
                }
            }
        }
        return instance;
    }
}

LazybonesSingleton采? volatile 關(guān)鍵字修飾也是很有必要的, instance = new LazybonesSingleton(); 這段代碼其實(shí)是分為三步執(zhí)行:

  1. instance 分配內(nèi)存空間
  2. 初始化 instance
  3. instance 指向分配的內(nèi)存地址

但是由于 JVM 具有指令重排的特性谒府,執(zhí)?順序有可能變成 1->3->2拼坎。指令重排在單線程環(huán)境下不會(huì)出現(xiàn)問題,但是在多線程環(huán)境下會(huì)導(dǎo)致?個(gè)線程獲得還沒有初始化的實(shí)例完疫。例如泰鸡,線程 T1 執(zhí)?了 1 和 3,此時(shí) T2 調(diào)? getInstance() 后發(fā)現(xiàn) instance不為空壳鹤,因此返回instance盛龄,但此時(shí) instance還未被初始化。

使? volatile可以禁? JVM 的指令重排器虾,保證在多線程環(huán)境下也能正常運(yùn)?

餓漢模式代碼實(shí)現(xiàn)

public class HungrySingleton {
    //一開始類加載的時(shí)候就進(jìn)行實(shí)例化讯嫂,創(chuàng)建單實(shí)例對(duì)象
    private static HungrySingleton instance = new HungrySingleton();
    private HungrySingleton(){

    }
    public static HungrySingleton getInstance(){
        return instance;
    }
}

單例中懶漢和餓漢的區(qū)別

(1) 線程安全:餓漢式在線程還沒出現(xiàn)之前就已經(jīng)實(shí)例化了,所以餓漢式一定是線程安全的兆沙。懶漢式加載是在使用時(shí)才會(huì)去new實(shí)例的欧芽,那么你去new的時(shí)候是一個(gè)動(dòng)態(tài)的過程,因此在new需要使用一些機(jī)制去保證創(chuàng)建實(shí)例時(shí)候的線程安全葛圃,例如上面代碼所使用的同步鎖+雙檢查機(jī)制千扔。

(2)執(zhí)行效率:餓漢式?jīng)]有加任何的鎖,因此執(zhí)行效率比較高库正。懶漢式一般使用都會(huì)加同步鎖曲楚,效率比餓漢式差。
(3)內(nèi)存使用:餓漢式在一開始類加載的時(shí)候就實(shí)例化褥符,無(wú)論使用與否龙誊,都會(huì)實(shí)例化,所以會(huì)占據(jù)空間喷楣,浪費(fèi)內(nèi)存趟大。懶漢式什么時(shí)候用就什么時(shí)候?qū)嵗资鳎焕速M(fèi)內(nèi)存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逊朽,一起剝皮案震驚了整個(gè)濱河市罕伯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叽讳,老刑警劉巖追他,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異岛蚤,居然都是意外死亡邑狸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門灭美,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)推溃,“玉大人,你說(shuō)我怎么就攤上這事届腐。” “怎么了蜂奸?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵犁苏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我扩所,道長(zhǎng)围详,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任祖屏,我火速辦了婚禮助赞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袁勺。我一直安慰自己雹食,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布期丰。 她就那樣靜靜地躺著群叶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钝荡。 梳的紋絲不亂的頭發(fā)上街立,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音埠通,去河邊找鬼赎离。 笑死,一個(gè)胖子當(dāng)著我的面吹牛端辱,可吹牛的內(nèi)容都是我干的梁剔。 我是一名探鬼主播虽画,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼憾朴!你這毒婦竟也來(lái)了狸捕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤众雷,失蹤者是張志新(化名)和其女友劉穎灸拍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砾省,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸡岗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了编兄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轩性。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狠鸳,靈堂內(nèi)的尸體忽然破棺而出揣苏,到底是詐尸還是另有隱情,我是刑警寧澤件舵,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布卸察,位于F島的核電站,受9級(jí)特大地震影響铅祸,放射性物質(zhì)發(fā)生泄漏坑质。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一临梗、第九天 我趴在偏房一處隱蔽的房頂上張望涡扼。 院中可真熱鬧,春花似錦盟庞、人聲如沸吃沪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巷波。三九已至,卻和暖如春卸伞,著一層夾襖步出監(jiān)牢的瞬間抹镊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工荤傲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垮耳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像终佛,于是被迫代替她去往敵國(guó)和親俊嗽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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