單例模式雙重檢查(DCL)引發(fā)的多線程問題

首先先看一個使用雙重檢查的單例模式:

public class DoubleCheckedLock{

? ? private static DoubleCheckedLock instance;

????public static DoubleCheckedLock getInstance(){

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

? ? ? ? ? ? synchronized(DoubleCheckdLock.class)

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

? ? ? ? ? ? ? ? instance = new DoubleCheckedLock();

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return instance;

????}

}

雙檢鎖機制的出現(xiàn)確實是解決了多線程并行中不會出現(xiàn)重復new對象棚蓄,而且也實現(xiàn)了懶加載,但很遺憾的是? ? ? ? ? ? ? instance = new DoubleCheckedLock()在編譯器下實現(xiàn)是有過程的

過程1.? ? 給新的實體instance分配內(nèi)存

過程2.? ? 調(diào)用DoubleCheckedLock的構(gòu)造函數(shù)給instance初始化

過程3.? ? 將incetance指向分配的內(nèi)存空間

在這三個過程之間,由于JVM的“優(yōu)化”機制,如果出現(xiàn)多線程并發(fā)訪問的情況,就會出現(xiàn)A線程在執(zhí)行過程2的時候毒嫡,已經(jīng)分配好了內(nèi)存莹妒,此時想要進入過程3,不巧的是诈茧,線程B進入了過程2,此時instance并不為null(內(nèi)存已經(jīng)被分配),導致線程B此時不執(zhí)行創(chuàng)建對象的語句捂掰,改為直接返回一個未初始化的DoubleCheckedLock對象!

可以使用volatile關(guān)鍵字來定義該變量的語義敢会,使得每次修改instance后,線程工作內(nèi)存強制刷新到主存中这嚣,禁止了JVM的指令重排序鸥昏,防止了該問題

使用volatile另一個方面則使instance對于其他線程可見,這里被鎖住的是DoubleCheckedLock.class而非instance姐帚,如果不使用volatile吏垮,則有可能引發(fā)當前變量更改后只存在于自身線程的工作內(nèi)存中(即未同步到主存)而引發(fā)的多個線程創(chuàng)建多個實例的后果,導致單例模式失去意義罐旗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膳汪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子九秀,更是在濱河造成了極大的恐慌遗嗽,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼓蜒,死亡現(xiàn)場離奇詭異痹换,居然都是意外死亡征字,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門晴音,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柔纵,“玉大人,你說我怎么就攤上這事锤躁「榱希” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵系羞,是天一觀的道長郭计。 經(jīng)常有香客問我,道長椒振,這世上最難降的妖魔是什么昭伸? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮澎迎,結(jié)果婚禮上庐杨,老公的妹妹穿的比我還像新娘。我一直安慰自己夹供,他們只是感情好灵份,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哮洽,像睡著了一般填渠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸟辅,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天氛什,我揣著相機與錄音,去河邊找鬼匪凉。 笑死枪眉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的再层。 我是一名探鬼主播贸铜,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼树绩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起隐轩,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤饺饭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后职车,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘫俊,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鹊杖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扛芽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骂蓖。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖川尖,靈堂內(nèi)的尸體忽然破棺而出登下,到底是詐尸還是另有隱情,我是刑警寧澤叮喳,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布被芳,位于F島的核電站,受9級特大地震影響馍悟,放射性物質(zhì)發(fā)生泄漏畔濒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一锣咒、第九天 我趴在偏房一處隱蔽的房頂上張望侵状。 院中可真熱鬧,春花似錦毅整、人聲如沸趣兄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诽俯。三九已至,卻和暖如春承粤,著一層夾襖步出監(jiān)牢的瞬間暴区,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工辛臊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仙粱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓彻舰,卻偏偏與公主長得像伐割,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刃唤,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 從三月份找實習到現(xiàn)在隔心,面了一些公司,掛了不少尚胞,但最終還是拿到小米硬霍、百度、阿里笼裳、京東唯卖、新浪粱玲、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,185評論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理拜轨,服務(wù)發(fā)現(xiàn)抽减,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法橄碾,類相關(guān)的語法卵沉,內(nèi)部類的語法,繼承相關(guān)的語法堪嫂,異常的語法偎箫,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 小Z是一個初入社會的女孩子淹办,掙著月薪2k的微薄收入,在繁華的市中心上班恶复,每月除了房租和吃飯怜森,基本沒有結(jié)余“担可是副硅,她...
    霽雨初晴閱讀 301評論 0 0
  • 2017年就要來了 期末考試也臨近了 每個同學都想過個好年 考個不錯的成績 壓力隨之而來 不同星座的同學都有 自己...
    032d6846533c閱讀 457評論 0 0