精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

有關(guān)雙檢測(cè)鎖定(DCL)和Singleton模式的問(wèn)題

開(kāi)發(fā) 后端
本文解釋了一個(gè)有關(guān)雙檢測(cè)鎖定(DCL)和Singleton模式的問(wèn)題。在多線程的情況下Singleton模式會(huì)遇到不少問(wèn)題,一個(gè)解決方案是雙檢測(cè)鎖定,不過(guò)事實(shí)上這種方法在JDK5之前會(huì)導(dǎo)致問(wèn)題。

看OOP教材時(shí),提到了一個(gè)雙檢測(cè)鎖定(Double-Checked Lock, DCL)的問(wèn)題,但是書(shū)上沒(méi)有多介紹,只是說(shuō)這是一個(gè)和底層內(nèi)存機(jī)制有關(guān)的漏洞。查閱了下相關(guān)資料,對(duì)這個(gè)問(wèn)題大致有了點(diǎn)了解。

從頭開(kāi)始說(shuō)吧。

在多線程的情況下Singleton模式會(huì)遇到不少問(wèn)題,一個(gè)簡(jiǎn)單的例子

1:  class Singleton {      
   2:      private static Singleton instance = null;     
   3:        
   4:      public static Singleton instance() {     
   5:          if (instance == null) {     
   6:              instance = new Singleton();     
   7:          }     
   8:          return instance;    
   9:      }    
   10:  }
  

假設(shè)這樣一個(gè)場(chǎng)景,有兩個(gè)線程調(diào)用Singleton.instance(),首先線程一判斷instance是否等于null,判斷完后一瞬間虛擬機(jī)把線程二調(diào)度為運(yùn)行線程,線程二再次判斷instance是否為null,然后創(chuàng)建一個(gè)Singleton實(shí)例,線程二的時(shí)間片用完后,線程一被喚醒,接下來(lái)它執(zhí)行的代碼依然是instance = new Singleton();
兩次調(diào)用返回了不同的對(duì)象,出現(xiàn)問(wèn)題了。

最簡(jiǎn)單的方法自然是在類被載入時(shí)就初始化這個(gè)對(duì)象:private static Singleton instance = new Singleton();

JLS(Java Language Specification)中規(guī)定了一個(gè)類只會(huì)被初始化一次,所以這樣做肯定是沒(méi)問(wèn)題的。

但是如果要實(shí)現(xiàn)延遲初始化(Lazy initialization),比如這個(gè)實(shí)例初始化時(shí)的參數(shù)要在運(yùn)行期才能確定,應(yīng)該怎么做呢?

依然有最簡(jiǎn)單的方法:使用synchronized關(guān)鍵字修飾初始化方法:

  1. public synchronized static Singleton instance() {          
  2.     if (instance == null) {  
  3.         instance = new Singleton();  
  4.     }  
  5.     return instance;  
  6. }   

這里有一個(gè)性能問(wèn)題:多個(gè)線程同時(shí)訪問(wèn)這個(gè)方法時(shí),會(huì)因?yàn)橥蕉鴮?dǎo)致每次只有一個(gè)線程運(yùn)行,影響程序性能。而事實(shí)上初始化完畢后只需要簡(jiǎn)單的返回instance的引用就行了。

雙檢測(cè)鎖定解決方案

DCL是一個(gè)“看似”有效的解決方法,先把對(duì)應(yīng)代碼放上來(lái)吧:

    1 :   class Singleton {   
    2 :       private static Singleton instance = null ;   
    3 :      
    4 :       public static Singleton instance() {   
    5 :           if (instance == null ) {
    6 :               synchronized (this) {   
    7 :                   if (instance == null)
    8 :                      instance = new Singleton();
    9 :              }
    10 :          }
    11 :          return instance;
    12 :      }
    13 :  }

用JavaWorld上對(duì)應(yīng)文章的標(biāo)題來(lái)評(píng)論這種做法就是smart, but broken。來(lái)看原因:

Java編譯器為了提高程序性能會(huì)進(jìn)行指令調(diào)度,CPU在執(zhí)行指令時(shí)同樣出于性能會(huì)亂序執(zhí)行(至少現(xiàn)在用的大多數(shù)通用處理器都是out-of-order的),另外cache的存在也會(huì)改變數(shù)據(jù)回寫(xiě)內(nèi)存時(shí)的順序[2]。JMM(Java Memory Model, 見(jiàn)[1])指出所有的這些優(yōu)化都是允許的,只要運(yùn)行結(jié)果和嚴(yán)格按順序執(zhí)行所得的結(jié)果一樣即可。

Java假設(shè)每個(gè)線程都跑在自己的處理器上,享有自己的內(nèi)存,和共享的主存交互。注意即使在單核上這種模型也是有意義的,考慮到cache和寄存器會(huì)保存部分臨時(shí)變量。理論上每個(gè)線程修改自己的內(nèi)存后,必須立即更新對(duì)應(yīng)的主存內(nèi)容。但是Java設(shè)計(jì)師們認(rèn)為這種約束會(huì)影響程序性能,他們?cè)囍鴦?chuàng)造了一套讓程序跑得更快、但又保證線程之間的交互與預(yù)期一致的內(nèi)存模型。

synchronized關(guān)鍵字便是其中一把利器。事實(shí)上,synchronized塊的實(shí)現(xiàn)和Linux中的信號(hào)量(semaphore)還是有區(qū)別的,前者過(guò)程中鎖的獲得和釋放都會(huì)都會(huì)引發(fā)一次Memory Barrier來(lái)強(qiáng)制線程本地內(nèi)存和主存之間的同步。通過(guò)這個(gè)機(jī)制,Java中的同步機(jī)制保證了synchronized塊中指令的原子性(atomic)。

雙檢測(cè)鎖定的問(wèn)題

好了,回過(guò)頭來(lái)看DCL問(wèn)題。看起來(lái)訪問(wèn)一個(gè)未同步的instance字段不會(huì)產(chǎn)生什么問(wèn)題,我們?cè)俅蝸?lái)假設(shè)一個(gè)場(chǎng)景:

線程一進(jìn)入同步塊,執(zhí)行instance = new Singleton(); 線程二剛開(kāi)始執(zhí)行g(shù)etResource();

按照順序的話,接下來(lái)應(yīng)該執(zhí)行的步驟是 1) 分配新的Singleton對(duì)象的內(nèi)存 2) 調(diào)用Singleton的構(gòu)造器,初始化成員字段 3) instance被賦為指向新的對(duì)象的引用。

前面說(shuō)過(guò),編譯器或處理器都為了提高性能都有可能進(jìn)行指令的亂序執(zhí)行,線程一的真正執(zhí)行步驟可能是1) 分配內(nèi)存 2) instance指向新對(duì)象 3) 初始化新實(shí)例。如果線程二在2完成后3執(zhí)行前被喚醒,它看到了一個(gè)不為null的instance,跳出方法體走了,帶著一個(gè)還沒(méi)初始化的Singleton對(duì)象。

錯(cuò)誤發(fā)生的一種情形就是這樣,關(guān)于更詳細(xì)的編譯器指令調(diào)度導(dǎo)致的問(wèn)題,可以參看這個(gè)網(wǎng)頁(yè) [4]。

[3] 中提供了一個(gè)編譯器指令調(diào)度的證據(jù)

instance = new Singleton(); 這條命令在Symantec JIT中被編譯成

  1. 0206106A   mov         eax,0F97E78h  
  2. 0206106F   call        01F6B210                  ; 分配空間  
  3. 02061074   mov         dword ptr [ebp],eax       ; EBP中保存了instance的地址   
  4.  
  5. 02061077   mov         ecx,dword ptr [eax]       ; 解引用,獲得新的指針地址   
  6.  
  7. 02061079   mov         dword ptr [ecx],100h      ; 接下來(lái)四行是inline后的構(gòu)造器  
  8. 0206107F   mov         dword ptr [ecx+4],200h      
  9. 02061086   mov         dword ptr [ecx+8],400h  
  10. 0206108D   mov         dword ptr [ecx+0Ch],0F84030h   
  11.  

可以看到,賦值完成在初始化之前,而這是JLS允許的。
 
另一種情形是,假設(shè)線程一安穩(wěn)地完成Singleton對(duì)象的初始化,退出了同步塊,并同步了和本地內(nèi)存和主存。線程二來(lái)了,看到一個(gè)非空的引用,拿走。注意線程二沒(méi)有執(zhí)行一個(gè)Read Barrier,因?yàn)樗揪蜎](méi)進(jìn)后面的同步塊。所以很有可能此時(shí)它看到的數(shù)據(jù)是陳舊的。

還有很多人根據(jù)已知的幾種提出了一個(gè)又一個(gè)fix的方法,但最終還是出現(xiàn)了更多的問(wèn)題。可以參閱[3]中的介紹。

[5]中還說(shuō)明了即使把instance字段聲明為volatile還是無(wú)法避免錯(cuò)誤的原因。

由此可見(jiàn),安全的Singleton的構(gòu)造一般只有兩種方法,一是在類載入時(shí)就創(chuàng)建該實(shí)例,二是使用性能較差的synchronized方法。

本文來(lái)自ZelluX的BlogJava博客《Singleton模式與雙檢測(cè)鎖定(DCL) 》一文

參考資料:
[1] Java Language Specification, Second Edition, 第17章介紹了Java中線程和內(nèi)存交互關(guān)系的具體細(xì)節(jié)。
[2] out-of-order與cache的介紹可以參閱Computer System, A Programmer's Perspective的第四、五章。
[3] The "Double-Checked Locking is Broken" Declaration
[4] Synchronization and the Java Memory Model
[5] Double-checked locking: Clever, but broken
[6] Holub on Patterns, Learning Design Patterns by Looking at Code

【編輯推薦】

  1. 最簡(jiǎn)單的設(shè)計(jì)模式學(xué)習(xí):Singleton模式
  2. 詳解Java Singleton模式的好處
  3. Java設(shè)計(jì)模式與應(yīng)用淺談
  4. 設(shè)計(jì)模式在EJB中的應(yīng)用
  5. 探討JSF框架中使用的設(shè)計(jì)模式
責(zé)任編輯:yangsai 來(lái)源: ZelluX的博客
相關(guān)推薦

2025-06-10 09:07:32

Go模式開(kāi)發(fā)

2013-04-19 09:16:56

2009-07-08 17:25:05

Java Single

2009-07-09 17:30:59

Singleton模式C++ SingletJava Single

2010-02-06 10:04:10

Android啟動(dòng)模式

2009-08-31 16:12:02

C#使用Singlet

2009-08-25 18:04:30

C#實(shí)現(xiàn)Singlet

2009-09-02 16:23:27

C# Singleto

2009-08-31 15:48:02

C# Singleto

2012-08-22 10:10:25

單態(tài)單態(tài)設(shè)計(jì)設(shè)計(jì)模式

2011-07-18 16:51:51

Cocoa 單態(tài) 模式

2010-07-14 14:20:47

IMAP協(xié)議服務(wù)

2009-08-12 13:22:44

Singleton模式

2009-09-24 16:55:27

策略模式

2021-03-18 18:07:57

JavaScript開(kāi)發(fā)代碼

2016-12-26 17:57:13

戴爾成就篇

2018-10-30 16:39:12

雙頻WiFi雙路

2010-03-09 16:38:22

Linux grub啟

2009-06-11 13:00:08

Java數(shù)組賦值

2010-07-08 12:49:12

SIP會(huì)話發(fā)起協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

中文字幕中文在线| av在线亚洲男人的天堂| 色噜噜日韩精品欧美一区二区| 国产探花在线观看| 粉嫩高潮美女一区二区三区 | 91色.com| 日韩av大片免费看| 神马久久久久久久久久久| 精品欧美一区二区三区在线观看 | 中文字幕精品一区二区三区精品| 国产精品69av| 在线观看日本中文字幕| a∨色狠狠一区二区三区| 国产精品网站在线| 99porn视频在线| 日韩欧美三级在线观看| 少妇精品久久久一区二区三区| 欧美视频在线一区二区三区| 中文字幕乱码免费| 日韩中文字幕观看| 免费久久精品视频| 久久色免费在线视频| 少妇熟女视频一区二区三区 | 欧洲视频一区| 日韩亚洲欧美在线观看| 国产精品沙发午睡系列| 日本中文字幕在线播放| 福利一区福利二区| 国产高清视频一区三区| 午夜剧场免费在线观看| 久9re热视频这里只有精品| 91精品91久久久中77777| 亚洲成人在线视频网站| 亚洲精品一区二区三区新线路| 亚洲欧美日韩在线观看a三区 | av午夜在线| 成人久久18免费网站麻豆| 日本三级韩国三级久久| 国产这里有精品| 国产欧美日韩在线一区二区| 日韩免费一区二区| 成人亚洲精品777777大片| 午夜羞羞小视频在线观看| 国产亚洲综合性久久久影院| 成人欧美一区二区三区在线观看| 18国产免费视频| 狠狠色狠狠色综合日日tαg| 日韩视频中文字幕| 国产精品无码网站| 视频一区视频二区欧美| 在线视频你懂得一区二区三区| 免费在线黄网站| 欧美尤物美女在线| 久久综合色8888| 999在线观看免费大全电视剧| 亚洲网站在线免费观看| 亚洲欧美日韩国产一区| 97超视频免费观看| 欧美黄色免费在线观看| 偷偷www综合久久久久久久| 亚洲人成网站777色婷婷| 精品国产av色一区二区深夜久久| 亚洲电影有码| 日韩欧美主播在线| 男女视频网站在线观看| 七七久久电影网| 亚洲另类春色国产| 婷婷视频在线播放| 青青青青在线| 成人欧美一区二区三区黑人麻豆| 神马欧美一区二区| 三区在线观看| 91丨九色丨黑人外教| 国产精品白丝jk白祙| 亚洲av色香蕉一区二区三区| 国产中文一区二区三区| 成人午夜黄色影院| 国产精品久久久久久69| 久久精品免费| 国产精品444| 懂色av中文字幕| 日韩成人一区二区三区在线观看| 青草青草久热精品视频在线观看| 日韩三级免费看| 99国产精品99久久久久久粉嫩| 欧美丰满少妇xxxxx做受| 中国一级片在线观看| 亚洲九九视频| 久久99久久99精品免观看粉嫩| 欧美成人免费看| 影音先锋日韩资源| 91精品国产九九九久久久亚洲| 国产a免费视频| 国产精品久久久久久久久妇女| 精品国产一区二区三区久久狼5月| 无码人妻精品中文字幕| 一区二区三区午夜视频| 午夜欧美不卡精品aaaaa| 日韩精品久久久久久久酒店| 亚洲永久免费| 国产精品极品在线| 亚洲一区二区视频在线播放| 国内精品不卡在线| 国产精品久久久一区二区三区| 天天干天天操av| 久久久久国产精品厨房| 日韩高清专区| 成人影院在线观看| 五月天婷婷综合| 国产免费999| 精品精品视频| 日韩精品视频在线观看免费| 国产视频123区| 欧美日韩岛国| 国产91在线高潮白浆在线观看| 一卡二卡三卡在线观看| 国产91在线|亚洲| 欧洲亚洲一区二区| 国产理论在线观看| 天天色 色综合| 欧美私人情侣网站| 精品国产伦一区二区三区观看说明| 亚洲国产美女久久久久 | 国产91富婆露脸刺激对白| 美女三级99| 九七久久人人| 色偷偷一区二区三区| 俄罗斯女人裸体性做爰| 最新精品国偷自产在线| 久久久999成人| 成人a v视频| 国产成人精品免费看| 色婷婷精品国产一区二区三区| 主播国产精品| 欧美日韩在线播放三区四区| 亚洲精品成人无码毛片| 中文字幕伦av一区二区邻居| 久久夜色精品国产| 无码人妻丰满熟妇奶水区码| 成人动漫精品一区二区| 亚洲午夜精品久久久中文影院av| 波多野结衣在线播放| 欧美日产国产精品| 亚洲av片不卡无码久久| 欧美福利电影在线观看| 国产精品亚洲欧美导航| 亚洲精品久久久久久无码色欲四季| 久久免费视频一区| 老太脱裤子让老头玩xxxxx| 日韩黄色av| 中文字幕亚洲综合久久筱田步美| 日本一级一片免费视频| 粉嫩绯色av一区二区在线观看| 亚洲综合五月天| 青青青免费在线视频| 日韩精品在线网站| 国产黄色小视频网站| 免费成人在线网站| 日本精品一区二区三区不卡无字幕| √8天堂资源地址中文在线| 欧美一卡二卡在线观看| 国精产品视频一二二区| 日韩成人精品在线观看| 欧美日韩免费观看一区| 乱馆动漫1~6集在线观看| 欧美成人免费网站| 无码人妻精品一区二区三区夜夜嗨| 美女爽到高潮91| 日韩在线导航| 国产日韩另类视频一区| 亚洲欧美www| 国产毛片aaa| 成人免费视频播放| 日本在线xxx| 欧美福利在线播放网址导航| 久久久久中文字幕2018| 丰满肉嫩西川结衣av| 亚洲最新视频在线观看| 欧洲成人午夜精品无码区久久| 国产精品二区影院| 国产精品国产精品| gogo久久| 日韩精品在线免费播放| 四虎成人在线观看| xf在线a精品一区二区视频网站| 97国产在线播放| 国产毛片一区二区三区| 国产精品免费在线免费 | 精品一级少妇久久久久久久| 成人毛片视频在线观看| 日本在线xxx| 国产99久久| 成人免费看吃奶视频网站| 搞黄网站在线观看| 欧美日韩国产综合久久| 国精产品一区一区二区三区mba| 国产一区二区美女诱惑| www.成年人视频| 欧美挤奶吃奶水xxxxx| 国产成人精品视频在线| 日日夜夜精品一区| 精品久久久久久久久久久久久久久久久 | 欧美69精品久久久久久不卡| 午夜精品免费| 999在线免费观看视频| 在线免费av资源| 北条麻妃久久精品| 欧美视频在线观看一区二区三区| 欧美日韩亚洲91| 九九九视频在线观看| 激情丁香综合五月| 日韩av新片网| 日韩激情网站| 国产精品久久视频| 中文字幕在线观看播放| 日韩精品在线视频| 99精品视频免费看| 欧美日韩亚洲一区二| 日本一级特级毛片视频| 91在线看国产| 日本在线观看视频一区| 午夜一区不卡| 国产美女视频免费| 妖精视频一区二区三区免费观看| 91精品国产综合久久香蕉最新版| 蜜桃av在线| 欧美巨乳在线观看| 久久手机免费观看| 欧美成人国产一区二区| 中文字幕日韩经典| 性感美女极品91精品| 日本不卡一二区| 97国产一区二区| 亚洲国产欧美日韩在线| 日本伊人色综合网| 亚洲精品久久久久久久蜜桃臀| 日韩情爱电影在线观看| 久中文字幕一区| 一本色道69色精品综合久久| 国产精品欧美日韩久久| 欧美a级在线观看| 欧美另类高清videos| 黄色软件在线| 日韩电影大全免费观看2023年上| 国产白浆在线观看| 欧美日韩精品一区二区| 成人h动漫精品一区二区下载| 性感美女极品91精品| 久久久久久久极品内射| 国产精品午夜久久| 亚洲午夜久久久久久久久红桃| 国产91色综合久久免费分享| 中文字幕第66页| 精品在线免费观看| 男人添女人下面免费视频| 全国精品久久少妇| 不卡影院一区二区| 国产精品大片| 996这里只有精品| 你懂的网址国产 欧美| 在线看无码的免费网站| 日韩国产综合| 亚洲精品一区二区三区av| 蜜桃成人av| 日本一区二区三区四区高清视频 | 91精品国产色综合久久不卡蜜臀| 中文 欧美 日韩| 欧美在线视频不卡| 伊人成年综合网| 欧美色综合网站| 亚洲男人天堂网址| 欧美日韩一区二区三区在线免费观看 | 东京热无码av男人的天堂| 久久精品网站免费观看| 国产熟妇久久777777| 久久久久99精品国产片| 高清国产在线观看| 国产精品久久久久久久第一福利 | 久久精品国产综合精品| 欧美挤奶吃奶水xxxxx| 美日韩免费视频| 不卡视频在线| 一区视频二区视频| 综合五月婷婷| 国产精品一色哟哟| 国产一区二区三区成人欧美日韩在线观看 | 日本久久久精品视频| 亚洲欧美日韩专区| 韩国中文字幕av| 老司机免费视频一区二区| 色91精品久久久久久久久| 国内一区二区视频| 免费在线观看日韩av| k8久久久一区二区三区| 成人免费无码大片a毛片| 久久久久久夜精品精品免费| 在线观看日本中文字幕| 亚洲天堂精品视频| 高h视频免费观看| 午夜国产精品一区| 艳妇乳肉豪妇荡乳av无码福利| 911精品国产一区二区在线| 粉嫩av一区二区夜夜嗨| 亚洲欧美日韩一区在线| 暖暖日本在线观看| 欧美精品免费在线观看| 欧洲一区精品| 成人精品久久久| 麻豆一区一区三区四区| 天堂精品一区二区三区| 欧美精品日韩| 日韩精品一区二区三区色欲av| 日韩精品一二三| 日本泡妞xxxx免费视频软件| 91偷拍与自偷拍精品| 糖心vlog免费在线观看| 欧美日韩在线观看视频| 一区二区三区免费在线| 亚洲激情中文字幕| 黄页视频在线播放| 热re91久久精品国99热蜜臀| 玖玖玖视频精品| 欧美性xxxx69| 欧美日本不卡| 奇米影视四色在线| 成人aaaa免费全部观看| 97精品在线播放| 日本高清不卡在线观看| 国产又大又粗又长| 亚洲欧美成人在线| 国产三线在线| 91啪国产在线| 成人一二三区| 日本wwww视频| 国产福利一区二区三区视频在线 | 成人video亚洲精品| 国产精品福利片| 亚洲日产av中文字幕| 免费 成 人 黄 色| aaa亚洲精品一二三区| 国产真实乱人偷精品视频| 欧美变态凌虐bdsm| 色老头在线观看| av蓝导航精品导航| 亚洲成人资源| 中文字幕人妻一区二区三区| 亚洲一区二区av在线| 亚洲第一天堂影院| 欧美黑人xxxⅹ高潮交| 99精品中文字幕在线不卡| 欧美黄网在线观看| 大胆亚洲人体视频| 日本亚洲欧美在线| 日韩电影在线观看永久视频免费网站| sm在线观看| 精品国产一区二区三| 久久精品亚洲一区二区| 亚洲第一视频区| 欧美人狂配大交3d怪物一区| 黄色动漫在线观看| 91久久爱成人| 亚洲久色影视| 欧美图片一区二区| 欧美视频一区在线| 国产福利在线播放麻豆| 国产九色91| 久久久久久9| 国产男女猛烈无遮挡在线喷水| 91精品国产乱码| 国产丝袜视频在线播放| 久久久久久亚洲精品不卡4k岛国| 久久国产精品毛片| 蜜桃av.com| 精品国产第一区二区三区观看体验 | 一级全黄少妇性色生活片| 欧美美女操人视频| 欧美日韩一本| 中文字幕亚洲乱码| 亚洲一区二区三区美女| 蜜桃成人在线视频| 成人高清视频观看www| 国户精品久久久久久久久久久不卡| aaaa黄色片| 欧美日韩免费观看一区三区| 日本在线视频中文有码| 欧美日韩一区在线播放| 久久成人av少妇免费| 亚洲国产精品午夜在线观看| 亚洲深夜福利在线| 麻豆一二三区精品蜜桃| 黄色动漫在线免费看| 中文字幕视频一区二区三区久| 亚洲精品.www| 国产精品久久久久久久久久免费 | 久久精品视频一区二区三区| 99热这里只有精品3| 日韩av快播网址| 欧美区亚洲区| 国产白丝一区二区三区| 日韩av在线网页|