單例設計模式

Singleton是一種創(chuàng)建型模式甚淡,指某個類采用Singleton模式坦袍,則在這個類被創(chuàng)建后嚷炉,只可能產生一個實例供外部訪問渊啰,并且提供一個全局的訪問點。

核心知識點如下:

(1) 將采用單例設計模式的類的構造方法私有化(采用private修飾)申屹。

(2) 在其內部產生該類的實例化對象虽抄,并將其封裝成private static類型走搁。

(3) 定義一個靜態(tài)方法返回該類的實例独柑。

/*** 方法一

* 單例模式的實現(xiàn):餓漢式,線程安全 但效率比較低*/

public class SingletonTest {

// 定義一個私有的構造方法

private SingletonTest() {? ? ? }

// 將自身的實例對象設置為一個屬性,并加上Static和final修飾符

private static final SingletonTest instance = new SingletonTest();

// 靜態(tài)方法返回該類的實例

public static SingletonTest getInstancei() {

? ? returninstance;

? ? ?}

}

方法一就是傳說的中的餓漢模式

優(yōu)點是:寫起來比較簡單迈窟,而且不存在多線程同步問題,避免了synchronized所造成的性能問題忌栅;

缺點是:當類SingletonTest被加載的時候车酣,會初始化static的instance,靜態(tài)變量被創(chuàng)建并分配內存空間索绪,從這以后湖员,這個static的instance對象便一直占著這段內存(即便你還沒有用到這個實例),當類被卸載時瑞驱,靜態(tài)變量被摧毀娘摔,并釋放所占有的內存,因此在某些特定條件下會耗費內存唤反。

/***方法二

* 單例模式的實現(xiàn):飽漢式,非線程安全**/

publicclassSingletonTest {

// 定義私有構造方法(防止通過 new SingletonTest()去實例化)

privateSingletonTest() {? ? ? }

// 定義一個SingletonTest類型的變量(不初始化凳寺,注意這里沒有使用final關鍵字)

private static ? SingletonTest instance;

// 定義一個靜態(tài)的方法(調用時再初始化SingletonTest,但是多線程訪問時彤侍,可能造成重復初始化問題)public static ?SingletonTest getInstance() {

? ? ? if(instance ==null) ? ?instance=newSingletonTest();

? ? ?return instance;

? ? ? ? ?}

}

方法二就是傳說的中的飽漢模式

優(yōu)點是:寫起來比較簡單肠缨,當類SingletonTest被加載的時候,靜態(tài)變量static的instance未被創(chuàng)建并分配內存空間盏阶,當getInstance方法第一次被調用時晒奕,初始化instance變量,并分配內存名斟,因此在某些特定條件下會節(jié)約了內存脑慧;

缺點是:并發(fā)環(huán)境下很可能出現(xiàn)多個SingletonTest實例。

/***方法三

* 單例模式的實現(xiàn):飽漢式,線程安全簡單實現(xiàn)**/

public ?class ?SingletonTest {

//定義私有構造方法(防止通過 new SingletonTest()去實例化)

privateSingletonTest() {? ? ? }

//定義一個SingletonTest類型的變量(不初始化砰盐,注意這里沒有使用final關鍵字)

private ?static ?SingletonTest instance;

//定義一個靜態(tài)的方法(調用時再初始化SingletonTest闷袒,使用synchronized 避免多線程訪問時,可能造成重的復初始化問題)

public static synchronized SingletonTest getInstance() {

?if(instance ==null) instance=newSingletonTest();

? ?return instance;

? ? ?}

}

方法三為方法二的簡單優(yōu)化

優(yōu)點是:使用synchronized關鍵字避免多線程訪問時楞卡,出現(xiàn)多個SingletonTest實例霜运。

缺點是:同步方法頻繁調用時,效率略低蒋腮。

/*** 方法四

* 單例模式最優(yōu)方案

* 線程安全? 并且效率高**/

public class ?SingletonTest {

// 定義一個私有構造方法

?private ? SingletonTest() {

? }

? //定義一個靜態(tài)私有變量(不初始化淘捡,不使用final關鍵字,使用volatile保證了多線程訪問時instance變量的可見性池摧,避免了instance初始化時其他變量屬性還沒賦值完時焦除,被另外線程調用)

private ?static volatile ?SingletonTest instance;

//定義一個共有的靜態(tài)方法,返回該類型實例

public ?static ? SingletonTest getIstance() {

// 對象實例化時與否判斷(不使用同步代碼塊作彤,instance不等于null時膘魄,直接返回對象乌逐,提高運行效率)if(instance ==null) {

//同步代碼塊(對象未初始化時,使用同步代碼塊创葡,保證多線程訪問時對象在第一次創(chuàng)建后浙踢,不再重復被創(chuàng)建)

synchronized(SingletonTest.class) {

//未初始化,則初始instance變量

? ? ? ? ? ? ? if(instance ==null) {

? ? ? ? ? ? ? ? ? instance=newSingletonTest();

? ? ? ? ? ? ? ? ? }

? ? ?}

? ?}

? ? return instance;

? ?}

}

方法四為單例模式的最佳實現(xiàn)灿渴。內存占用地洛波,效率高,線程安全骚露,多線程操作原子性蹬挤。

(事實上,可以通過Java反射機制來實例化private類型的構造方法棘幸,此時基本上會使所有的Java單例實現(xiàn)失效焰扳。本帖不討論反射情況下問題,默認無反射误续,也是常見的面試已經應用場景)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末吨悍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子女嘲,更是在濱河造成了極大的恐慌畜份,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欣尼,死亡現(xiàn)場離奇詭異爆雹,居然都是意外死亡,警方通過查閱死者的電腦和手機愕鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門钙态,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菇晃,你說我怎么就攤上這事册倒。” “怎么了磺送?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵驻子,是天一觀的道長。 經常有香客問我估灿,道長崇呵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任馅袁,我火速辦了婚禮域慷,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己犹褒,他們只是感情好抵窒,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叠骑,像睡著了一般李皇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上座云,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天疙赠,我揣著相機與錄音,去河邊找鬼朦拖。 笑死,一個胖子當著我的面吹牛厌衔,可吹牛的內容都是我干的璧帝。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼富寿,長吁一口氣:“原來是場噩夢啊……” “哼睬隶!你這毒婦竟也來了?” 一聲冷哼從身側響起页徐,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤苏潜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后变勇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恤左,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年搀绣,在試婚紗的時候發(fā)現(xiàn)自己被綠了飞袋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡链患,死狀恐怖巧鸭,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情麻捻,我是刑警寧澤纲仍,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站贸毕,受9級特大地震影響郑叠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜崖咨,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一锻拘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦署拟、人聲如沸婉宰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽心包。三九已至,卻和暖如春馒铃,著一層夾襖步出監(jiān)牢的瞬間蟹腾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工区宇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娃殖,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓议谷,卻偏偏與公主長得像炉爆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卧晓,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理芬首,服務發(fā)現(xiàn),斷路器逼裆,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法郁稍,類相關的語法,內部類的語法胜宇,繼承相關的語法耀怜,異常的語法,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 1.懶漢式 線程不安全,當有多個線程并行調用getInstance()的時候掸屡,就會創(chuàng)建多個實例封寞。也就是說在多線程下...
    少一點閱讀 165評論 0 0
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”仅财。 何為單例模式狈究? 顧名思義,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,485評論 1 8
  • 一定有些什么遺留在這微風細雨里盏求,不然這纏綿飄逸的細雨抖锥,為什么總是能勾起我們無限的回憶。傘下的芬芳碎罚,是淡淡的...
    淺吟_865e閱讀 278評論 0 0