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

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>
            亚洲性线免费观看视频成熟| 久久av一区二区三区亚洲| 亚洲电影欧美电影有声小说| 欧美日韩国产页| 久久米奇亚洲| 久久综合九色综合久99| 久久精品夜色噜噜亚洲a∨| 欧美影院在线| 久久精品人人爽| 美女免费视频一区| 久久国产日本精品| 久久久久国产免费免费| 免费一区视频| 亚洲欧美日韩一区二区三区在线| 欧美一区午夜视频在线观看| 快she精品国产999| 国产欧美精品一区| 亚洲精品一二| 欧美jizzhd精品欧美巨大免费| 亚洲精品欧美在线| 久久伊人亚洲| 国产亚洲制服色| 亚洲欧美国产精品专区久久| 欧美电影在线观看| 性做久久久久久免费观看欧美| 免费亚洲一区二区| 国产揄拍国内精品对白| 亚洲视频香蕉人妖| 亚洲国产色一区| 久久国产精品久久久久久电车| 欧美视频第二页| 在线中文字幕一区| 99日韩精品| 国产精品久久久久久久浪潮网站 | 久久99伊人| 99re66热这里只有精品3直播| 久久精品一级爱片| 亚洲激情在线观看| 亚洲国产成人在线| 欧美精品日韩综合在线| 亚洲精品麻豆| 一本色道久久综合亚洲精品不 | 欧美一区二区精品久久911| 女同性一区二区三区人了人一| 亚洲伊人久久综合| 国产欧美视频在线观看| 久久精品一区二区三区四区| 亚洲欧美韩国| 伊甸园精品99久久久久久| 久久亚洲欧美| 欧美成人四级电影| 亚洲三级视频| 国产精品久久久免费| 久久精品国产精品亚洲| 欧美不卡视频| 欧美伊人精品成人久久综合97 | 亚洲欧美视频一区| 久久精品亚洲| 亚洲欧美精品| 久久视频精品在线| 久久爱www久久做| 欧美日韩亚洲一区二区三区在线 | 欧美不卡视频一区| 久久久国产一区二区| 欧美日韩小视频| 亚洲高清毛片| 国产日韩一区二区三区在线| 亚洲美女在线观看| 99视频热这里只有精品免费| 性欧美暴力猛交69hd| 久久成人精品无人区| 国产精品激情| 欧美在线网址| 国产精品综合不卡av| 性色av一区二区三区在线观看| 欧美va亚洲va香蕉在线| 欧美国产亚洲精品久久久8v| 欲香欲色天天天综合和网| 欧美一区二区视频网站| 久久精品国产免费看久久精品| 欧美视频一二三区| 亚洲欧美综合另类中字| 欧美在线观看你懂的| 国产亚洲一本大道中文在线| 久久国产一区二区| 久久亚洲欧美| 在线视频亚洲| 国产精品久久久久婷婷| 午夜欧美电影在线观看| 亚洲第一中文字幕| 亚洲一区3d动漫同人无遮挡| 国产精品视频不卡| 久久尤物电影视频在线观看| 日韩视频一区二区三区| 欧美一区中文字幕| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 伊大人香蕉综合8在线视| 欧美日韩国产在线播放网站| 欧美一区二区福利在线| 在线欧美一区| 国产亚洲欧美一区| 国产精品久久9| 欧美日韩另类一区| 欧美激情第一页xxx| 久热精品视频在线观看一区| 日韩一区二区精品视频| 欧美黄色精品| 欧美电影打屁股sp| 香蕉久久a毛片| 久久riav二区三区| 久久狠狠亚洲综合| 久久乐国产精品| 久久久久久久综合| 久久精品亚洲精品| 农村妇女精品| 欧美承认网站| 亚洲人成毛片在线播放女女| 亚洲国产va精品久久久不卡综合| 蜜乳av另类精品一区二区| 99re在线精品| 精品动漫一区二区| 国模精品一区二区三区色天香| 国产精品日韩久久久| 国产精品视频免费在线观看| 欧美—级高清免费播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美一区永久视频免费观看| 久久久久高清| 欧美日韩1区| 国产伦精品一区二区三区免费| 国产精品网站一区| 伊伊综合在线| 亚洲视频播放| 久久嫩草精品久久久久| 欧美激情亚洲激情| 亚洲视频一区二区| 浪潮色综合久久天堂| 国产精品三上| 亚洲精选一区二区| 久久久久www| 日韩视频精品在线| 久久久久久一区二区| 欧美日韩国产影院| 亚洲激情另类| 久久婷婷激情| 亚洲黄色成人| 亚洲免费影视| 亚洲经典三级| 久久在线观看视频| 国产日韩一区二区三区在线播放 | 依依成人综合视频| 久久激五月天综合精品| 亚洲精品永久免费| 久久本道综合色狠狠五月| 国产欧美日韩视频一区二区| 欧美视频在线免费| 亚洲国产日韩欧美在线99| 麻豆成人综合网| 麻豆91精品91久久久的内涵| 国产一区二区三区成人欧美日韩在线观看| 亚洲毛片视频| 最新日韩av| 国产精品高清一区二区三区| 午夜精品免费在线| 久久精品国产99国产精品| 亚洲福利小视频| 亚洲欧美日韩另类精品一区二区三区| 亚洲午夜精品久久| 午夜精品久久久久久久久久久久| 国产日韩在线看片| 亚洲国产精品久久久久| 国产精品欧美日韩一区二区| 久久久久久久欧美精品| 欧美激情一区| 久久综合久久综合这里只有精品| 久久婷婷色综合| 亚洲午夜视频在线观看| 久久亚洲精选| 性欧美精品高清| 久久国产精品久久国产精品| 亚洲经典三级| 亚洲午夜免费视频| 欧美日韩亚洲网| 久久综合伊人77777麻豆| 欧美午夜无遮挡| 99这里只有久久精品视频| 在线日韩欧美| 久久国产精品久久国产精品| 亚洲欧美日韩另类| 国产精品国产福利国产秒拍| 亚洲第一成人在线| 亚洲第一精品在线| 99国内精品久久| 亚洲国产成人久久| 亚洲黄色一区| 久久国产精品久久w女人spa| 欧美一级在线视频| 国产裸体写真av一区二区| 亚洲亚洲精品三区日韩精品在线视频| 日韩视频永久免费|