Java中的6種單例模式

一印蓖、單例概念

單例模式是一種對(duì)象創(chuàng)建模式,它用于產(chǎn)生一個(gè)對(duì)象的具體實(shí)例遵馆,它可以確保系統(tǒng)中一個(gè)類只產(chǎn)生一個(gè)實(shí)例

二鲸郊、好處

1、對(duì)應(yīng)頻繁使用的對(duì)象团搞,可以省略創(chuàng)建對(duì)象所花費(fèi)的時(shí)間严望,對(duì)于那些重量級(jí)對(duì)象而言多艇,是非陈呖郑客觀的一筆系統(tǒng)開銷。

2峻黍、由于new操作次數(shù)減少复隆,因此對(duì)系統(tǒng)內(nèi)存的使用頻率也會(huì)降低,這將減少GC壓力姆涩,縮短GC停頓時(shí)間

三挽拂、單例的六種寫法和各自的特點(diǎn)

餓漢/懶漢/懶漢線程安全/DCL/靜態(tài)內(nèi)部類/枚舉

1.餓漢

public class HungrySingleton {

//1.實(shí)例化變量是靜態(tài)的

private static HungrySingleton singleton = new HungrySingleton();

//2.構(gòu)造方法是私有的

private HungrySingleton(){

//一旦使用此方法立馬被調(diào)用

}

//獲取實(shí)例的方法是靜態(tài)的

public static HungrySingleton getHungrySingleton(){

return singleton;

}

}

缺點(diǎn):即使沒有使用這個(gè)類都會(huì)被初始化,如果初始化內(nèi)容比較多的話骨饿,對(duì)性能的影響是很大的

無法對(duì)instance實(shí)例做延遲加載

2.懶漢模式

public class LazySingleton {

public static? LazySingleton singleton;

//構(gòu)造方法是私有的

private LazySingleton(){}

public static LazySingleton getSingleton(){

if (singleton==null){

//第一次創(chuàng)建時(shí)會(huì)被初始化

singleton = new LazySingleton();

}

return singleton;

}

}

缺點(diǎn):(并非同步)多線程的并非這樣的實(shí)現(xiàn)是無法保證實(shí)例是唯一的

3.懶漢線程安全模式

public class LazySafeSingleton {

public static LazySafeSingleton safeSingleton;

private LazySafeSingleton(){}

//方法中聲明synchronized關(guān)鍵字(方法一)

public synchronized static LazySafeSingleton getSafeSingleton(){

if (safeSingleton==null){

safeSingleton = new LazySafeSingleton();

}

return? safeSingleton;

}

//同步代碼塊的實(shí)現(xiàn)(方法二)

public static? LazySafeSingleton getInstance(){

synchronized (LazySafeSingleton.class){

if (safeSingleton==null){//

safeSingleton = new LazySafeSingleton();

}

}

return safeSingleton;

}

}

缺點(diǎn):性能(synchronized關(guān)鍵字)上的缺點(diǎn)亏栈,每次只有一個(gè)線程讀取實(shí)例

4.DCL(double check lock)雙重檢查鎖設(shè)計(jì)模式

public class DCLSingleton {

private static? volatile DCLSingleton? singleton;

private DCLSingleton(){}

public static DCLSingleton getInstance(){

//避免不必要的同步

if (singleton==null){

//同步

synchronized (DCLSingleton.class){

//在第一次調(diào)用時(shí)初始化

if (singleton==null){

singleton = new DCLSingleton();

}

}

}

return singleton;

}

}

//可能會(huì)有多個(gè)線程一起進(jìn)入同步代碼塊外的情況,如果不檢驗(yàn)的話就會(huì)生成多個(gè)實(shí)例宏赘,就成了

懶漢模式中的缺點(diǎn)

//缺點(diǎn):JVM的即時(shí)編譯器中存在指令重排序的優(yōu)化(volatile)優(yōu)化

5.靜態(tài)內(nèi)部類單例設(shè)計(jì)模式

public class StaticSingleton {

private StaticSingleton(){}

public static StaticSingleton getInStance(){

return Singler.singleton;

}

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

private static class Singler{

private static? final StaticSingleton singleton = new StaticSingleton();

}

}

//優(yōu)點(diǎn):jvm本身機(jī)制保證了線程安全/沒有性能缺陷

原因:static/final(初始化之后無法被修改)

6.枚舉單例設(shè)計(jì)模式(java5之后)

public enum? EnumSingleton {

//定義一個(gè)枚舉的元素绒北,它是singleton的實(shí)例

INSTANCE;

public void doSomething(){

}

}

優(yōu)點(diǎn):寫法簡(jiǎn)單/線程安全

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市察署,隨后出現(xiàn)的幾起案子闷游,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脐往,死亡現(xiàn)場(chǎng)離奇詭異休吠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)业簿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門瘤礁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梅尤,你說我怎么就攤上這事蔚携。” “怎么了克饶?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵酝蜒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我矾湃,道長(zhǎng)亡脑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任邀跃,我火速辦了婚禮霉咨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拍屑。我一直安慰自己途戒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布僵驰。 她就那樣靜靜地躺著喷斋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒜茴。 梳的紋絲不亂的頭發(fā)上星爪,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音粉私,去河邊找鬼顽腾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诺核,可吹牛的內(nèi)容都是我干的抄肖。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼窖杀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼漓摩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起陈瘦,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤幌甘,失蹤者是張志新(化名)和其女友劉穎潮售,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锅风,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酥诽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皱埠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肮帐。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖边器,靈堂內(nèi)的尸體忽然破棺而出训枢,到底是詐尸還是另有隱情,我是刑警寧澤忘巧,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布恒界,位于F島的核電站,受9級(jí)特大地震影響砚嘴,放射性物質(zhì)發(fā)生泄漏十酣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一际长、第九天 我趴在偏房一處隱蔽的房頂上張望耸采。 院中可真熱鬧,春花似錦工育、人聲如沸虾宇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘱朽。三九已至,卻和暖如春竭沫,著一層夾襖步出監(jiān)牢的瞬間燥翅,已是汗流浹背骑篙。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工蜕提, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人靶端。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓谎势,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親杨名。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脏榆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法台谍,內(nèi)部類的語法须喂,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,602評(píng)論 18 399
  • 1 場(chǎng)景問題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個(gè)應(yīng)用坞生,讀取配置文件的內(nèi)容仔役。 很多應(yīng)用項(xiàng)目,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,683評(píng)論 12 68
  • 前言 本文主要參考 那些年是己,我們一起寫過的“單例模式”又兵。 何為單例模式? 顧名思義卒废,單例模式就是保證一個(gè)類僅有一個(gè)...
    tandeneck閱讀 2,494評(píng)論 1 8
  • 很多人用過單例模式沛厨,筆者面試時(shí),偶爾談起設(shè)計(jì)模式摔认,大部分人都會(huì)說自己會(huì)設(shè)計(jì)模式逆皮,基本上也就是說個(gè)單例模式、工廠模式...
    JonahCui閱讀 7,770評(píng)論 2 11
  • 從三月份找實(shí)習(xí)到現(xiàn)在参袱,面了一些公司页屠,掛了不少,但最終還是拿到小米蓖柔、百度辰企、阿里、京東况鸣、新浪牢贸、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,218評(píng)論 11 349