青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

colorful

zc qq:1337220912

 

Double-checked locking真的有效嗎?

Double-checked locking真的有效嗎?

作者: zsxwing 日期: 2011-04-29 10:48:06

在很多設(shè)計(jì)模式的書籍中,我們都可以看到類似下面的單例模式的實(shí)現(xiàn)代碼,一般稱為Double-checked locking(DCL)

01public class Singleton {
02 
03    private static Singleton instance;
04 
05    private Singleton() {
06        // do something
07    }
08 
09    public static Singleton getInstance() {
10        if (instance == null) {//1
11            synchronized (Singleton.class) {//2
12                if (instance == null) {//3
13                    instance = new Singleton();//4
14                }
15            }
16        }
17        return instance;
18    }
19}

這樣子的代碼看起來很完美,可以解決instance的延遲初始化。只是,事實(shí)往往不是如此。

問題在于instance = new Singleton();這行代碼。

在我們看來,這行代碼的意義大概是下面這樣子的

 

 

	mem = allocate();             //收集內(nèi)存 
ctorSingleton(mem); //調(diào)用構(gòu)造函數(shù)
instance = mem; //把地址傳給instance
	

 

這行代碼在Java虛擬機(jī)(JVM)看來,卻可能是下面的三個(gè)步驟(亂序執(zhí)行的機(jī)制):

 

	mem = allocate();             //收集內(nèi)存 
instance = mem; //把地址傳給instance
	ctorSingleton(instance);      //調(diào)用構(gòu)造函數(shù)

 

下面我們來假設(shè)一個(gè)場(chǎng)景。

  1. 線程A調(diào)用getInstance函數(shù)并且執(zhí)行到//4。但是線程A只執(zhí)行到賦值語句,還沒有調(diào)用構(gòu)造函數(shù)。此時(shí),instance已經(jīng)不是null了,但是對(duì)象還沒有初始化。
  2. 很不幸線程A這時(shí)正好被掛起。
  3. 線程B獲得執(zhí)行的權(quán)力,然后也開始調(diào)用getInstance。線程B在//1發(fā)現(xiàn)instance已經(jīng)不是null了,于是就返回對(duì)象了,但是這個(gè)對(duì)象還沒有初始化,于是對(duì)這個(gè)對(duì)象進(jìn)行操作就出錯(cuò)了。

問題就出在instance被提前初始化了。

解決方案一,不使用延遲加載:

01public class Singleton {
02 
03    private static Singleton instance = new Singleton();
04 
05    private Singleton() {
06        // do something
07    }
08 
09    public static Singleton getInstance() {
10        return instance;
11    }
12}

JVM內(nèi)部的機(jī)制能夠保證當(dāng)一個(gè)類被加載的時(shí)候,這個(gè)類的加載過程是線程互斥的。這樣當(dāng)我們第一次調(diào)用getInstance的時(shí)候,JVM能夠幫我們保證instance只被創(chuàng)建一次,并且會(huì)保證把賦值給instance的內(nèi)存初始化完畢。

解決方案二,利用一個(gè)內(nèi)部類來實(shí)現(xiàn)延遲加載:

01public class Singleton {
02 
03    private Singleton() {
04        // do something
05    }
06 
07    private static class SingletonContainer {
08        private static Singleton instance = new Singleton();
09    }
10 
11    public static Singleton getInstance() {
12        return SingletonContainer.instance;
13    }
14}

這兩種方案都是利用了JVM的類加載機(jī)制的互斥。

方案二的延遲加載實(shí)現(xiàn)是因?yàn)椋挥性诘谝淮握{(diào)用Singleton.getInstance()函數(shù)時(shí),JVM才會(huì)去加載SingletonContainer,并且初始化instance。

不只Java存在這個(gè)問題,C/C++由于CPU的亂序執(zhí)行機(jī)制,也同樣存在這樣的問題。

抱歉,我之前的理解有誤,DCL在Java中失效的原因是JIT比較激進(jìn)的優(yōu)化導(dǎo)致的,在C/C++并不會(huì)由于CPU的亂序執(zhí)行(調(diào)用構(gòu)造函數(shù)和賦值這兩個(gè)操作對(duì)CPU來說絕對(duì)不會(huì)亂序的)產(chǎn)生這個(gè)問題。

暫時(shí)不知道Java對(duì)于這個(gè)問題是否修復(fù)了。

posted on 2012-03-31 16:53 多彩人生 閱讀(327) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜久久一区| 欧美韩日精品| 99亚洲一区二区| 国产精品免费观看在线| 亚洲一二三区在线| 亚洲一区二区黄色| 极品av少妇一区二区| 亚洲国产另类久久精品| 欧美人成在线视频| 久久久久久久久一区二区| 欧美精品系列| 毛片基地黄久久久久久天堂| 欧美人成免费网站| 鲁大师影院一区二区三区| 欧美网站在线观看| 欧美成人乱码一区二区三区| 国产精品日韩专区| 免费中文日韩| 国产日韩精品一区二区| 亚洲免费高清| 亚洲精品黄网在线观看| 久久精品国产99国产精品澳门| 亚洲视频在线播放| 噜噜噜噜噜久久久久久91| 欧美一区二区三区四区高清| 欧美女同视频| 亚洲激情综合| 亚洲激情视频| 欧美在线视频导航| 香蕉久久夜色精品国产使用方法| 欧美国产日韩一区二区| 蜜乳av另类精品一区二区| 国产精品一区在线观看| 一区二区高清在线| 91久久精品日日躁夜夜躁国产| 欧美一区二区免费视频| 性做久久久久久免费观看欧美| 欧美日韩亚洲高清一区二区| 亚洲国产三级在线| 亚洲精品视频一区二区三区| 老色批av在线精品| 免费日韩视频| 亚洲国产裸拍裸体视频在线观看乱了| 欧美怡红院视频| 亚洲国产日韩综合一区| 亚洲丁香婷深爱综合| 久久成人国产| 亚洲一区二区网站| 免费成人在线观看视频| 久久综合久久久久88| 韩国av一区二区三区| 亚洲欧美www| 欧美一区二区在线视频| 国产日韩在线视频| 久久国产高清| 欧美精品三级日韩久久| 亚洲大片在线观看| 女人香蕉久久**毛片精品| 欧美黄色免费网站| 亚洲人成在线观看| 欧美日韩国产区| 中国女人久久久| 欧美一区二区三区四区视频| 国产一区二区激情| 久久亚洲国产精品日日av夜夜| 欧美 日韩 国产 一区| 亚洲国产高清自拍| 欧美精品手机在线| 亚洲一区免费看| 久久影视三级福利片| 亚洲国产精品尤物yw在线观看| 欧美精品三级日韩久久| 亚洲一区二区三区久久| 久久久久一区二区| 日韩视频免费观看| 国产精品视频一二| 久久久久久九九九九| 亚洲黄色在线看| 亚洲一区二区三区免费观看| 国产性天天综合网| 欧美激情第10页| 亚洲一区二区黄色| 欧美大片在线看免费观看| 国产精品99久久久久久宅男| 国产精品综合视频| 老司机成人网| 亚洲一区二区三区中文字幕| 看片网站欧美日韩| 一区二区不卡在线视频 午夜欧美不卡'| 欧美视频中文字幕| 久久亚洲美女| 亚洲一区二区精品视频| 欧美二区在线观看| 午夜精品久久久久久99热| 亚洲电影免费观看高清完整版| 欧美极品色图| 久久成人国产| 亚洲淫片在线视频| 亚洲国产欧美日韩| 久久国产精品黑丝| 9久草视频在线视频精品| 国内成人精品视频| 欧美午夜视频| 美女脱光内衣内裤视频久久影院 | 久久久久国产免费免费| 亚洲精品社区| 久久中文字幕导航| 亚洲一区www| 亚洲精华国产欧美| 国产永久精品大片wwwapp| 亚洲在线观看免费| 日韩亚洲精品视频| 红桃视频国产精品| 国产精品国产三级国产| 巨胸喷奶水www久久久免费动漫| 亚洲日本中文字幕免费在线不卡| 久久久水蜜桃| 亚洲一区图片| 一区二区三区偷拍| 亚洲精品永久免费精品| 伊人久久综合97精品| 国产欧美日韩综合| 国产精品你懂的在线欣赏| 欧美美女bb生活片| 欧美高清免费| 欧美激情一区二区三区全黄| 美女黄毛**国产精品啪啪| 久久岛国电影| 欧美在线观看视频在线| 亚洲欧美日韩中文在线制服| 一本色道婷婷久久欧美| 亚洲精品久久久久久久久| 亚洲大胆人体在线| 麻豆91精品| 老司机成人网| 老牛国产精品一区的观看方式| 久久一日本道色综合久久| 久久亚裔精品欧美| 久久综合亚州| 老司机精品福利视频| 欧美freesex8一10精品| 欧美激情精品久久久久久蜜臀 | 国产精品久久久久久久电影| 欧美日韩国产123区| 欧美日韩国产综合久久| 欧美亚洲第一区| 国产精品久久午夜夜伦鲁鲁| 国产精品女主播| 国产偷久久久精品专区| 国语自产偷拍精品视频偷| 一区一区视频| 亚洲精品国久久99热| 一区二区三区|亚洲午夜| 亚洲一区二区三区乱码aⅴ| 午夜伦理片一区| 久久午夜av| 亚洲国产日韩欧美在线动漫| 99re视频这里只有精品| 亚洲性色视频| 久久激情五月激情| 久久国产欧美精品| 鲁大师影院一区二区三区| 欧美日本中文| 国产欧美日韩免费| 亚洲丶国产丶欧美一区二区三区| 99re6热在线精品视频播放速度| 亚洲一区二区三| 久久亚洲视频| 亚洲美女色禁图| 欧美一区二区网站| 欧美福利视频在线观看| 国产女人水真多18毛片18精品视频| 激情久久久久久久| a91a精品视频在线观看| 欧美一区二区在线免费播放| 欧美高清自拍一区| 亚洲一区二区三区四区五区黄 | 亚洲免费影视| 久久综合国产精品| 亚洲精品一区二区在线| 亚洲免费视频在线观看| 免费日韩av| 国产精品专区h在线观看| 亚洲精品日本| 欧美一级欧美一级在线播放| 女人香蕉久久**毛片精品| 亚洲一区二区成人| 亚洲自啪免费| 小黄鸭精品密入口导航| 久久久久网站| 国产精品成人观看视频免费 | 正在播放亚洲一区| 麻豆精品传媒视频| 国产精品女主播| 亚洲最新色图| 欧美1区视频| 午夜精品一区二区三区在线播放| 欧美电影打屁股sp| 韩国av一区二区三区四区| 西瓜成人精品人成网站|