一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JAVA實(shí)現(xiàn)單例模式的四種方法和一些特點(diǎn)

 精髓_感知力 2016-03-08

一、餓漢式單例類

復(fù)制代碼 代碼如下:

public class Singleton 

    private Singleton(){ 

    } 

    private static Singleton instance = new Singleton(); 

    private static Singleton getInstance(){ 
        return instance; 
    } 

特點(diǎn):餓漢式提前實(shí)例化,沒(méi)有懶漢式中多線程問(wèn)題,但不管我們是不是調(diào)用getInstance()都會(huì)存在一個(gè)實(shí)例在內(nèi)存中

二、內(nèi)部類式單例類

復(fù)制代碼 代碼如下:

public class Singleton    
{       
        private Singleton(){    

    }    

    private class SingletonHoledr(){    
        private static Singleton instance = new Singleton();    
    }    

    private static Singleton getInstance(){    
        return SingletonHoledr.instance;    
    }    
}

特點(diǎn):內(nèi)部類式中,實(shí)現(xiàn)了延遲加載,只有我們調(diào)用了getInstance(),才會(huì)創(chuàng)建唯一的實(shí)例到內(nèi)存中.并且也解決了懶漢式中多線程的問(wèn)題.解決的方式是利用了Classloader的特性.

三、懶漢式單例類

復(fù)制代碼 代碼如下:

public class Singleton    
{       
    private Singleton(){    

    }    

    private static Singleton instance;    
    public static Singleton getInstance(){    
        if(instance == null){    
            return instance = new Singleton();    
        }else{    
            return instance;    
        }    
    }    
}  

特點(diǎn):在懶漢式中,有線程A和B,當(dāng)線程A運(yùn)行到第8行時(shí),跳到線程B,當(dāng)B也運(yùn)行到8行時(shí),兩個(gè)線程的instance都為空,這樣就會(huì)生成兩個(gè)實(shí)例。解決的辦法是同步:

可以同步但是效率不高:

復(fù)制代碼 代碼如下:

public class Singleton    
{       
    private Singleton(){    

    }    

    private static Singleton instance;    
    public static synchronized Singleton getInstance(){    
        if(instance == null){    
            return instance = new Singleton();    
        }else{    
            return instance;    
        }    
    }    
}

這樣寫(xiě)程序不會(huì)出錯(cuò),因?yàn)檎麄€(gè)getInstance是一個(gè)整體的"critical section",但就是效率很不好,因?yàn)槲覀兊哪康钠鋵?shí)只是在第一個(gè)初始化instance的時(shí)候需要locking(加鎖),而后面取用instance的時(shí)候,根本不需要線程同步。

于是聰明的人們想出了下面的做法:

雙檢鎖寫(xiě)法:

復(fù)制代碼 代碼如下:

public class Singleton{ 
  private static Singleton single;    //聲明靜態(tài)的單例對(duì)象的變量 
  private Singleton(){}    //私有構(gòu)造方法  

  public static Singleton getSingle(){    //外部通過(guò)此方法可以獲取對(duì)象   
    if(single == null){    
        synchronized (Singleton.class) {   //保證了同一時(shí)間只能只能有一個(gè)對(duì)象訪問(wèn)此同步塊       
            if(single == null){     
                single = new Singleton();         
        }    
      } 
    }   
    return single;   //返回創(chuàng)建好的對(duì)象  
  } 

思路很簡(jiǎn)單,就是我們只需要同步(synchronize)初始化instance的那部分代碼從而使代碼既正確又很有效率。
這就是所謂的“雙檢鎖”機(jī)制(顧名思義)。
很可惜,這樣的寫(xiě)法在很多平臺(tái)和優(yōu)化編譯器上是錯(cuò)誤的。

原因在于:instance = new Singleton()這行代碼在不同編譯器上的行為是無(wú)法預(yù)知的。一個(gè)優(yōu)化編譯器可以合法地如下實(shí)現(xiàn)instance = new Singleton():

1. instance  = 給新的實(shí)體分配內(nèi)存

2. 調(diào)用Singleton的構(gòu)造函數(shù)來(lái)初始化instance的成員變量

現(xiàn)在想象一下有線程A和B在調(diào)用getInstance,線程A先進(jìn)入,在執(zhí)行到步驟1的時(shí)候被踢出了cpu。然后線程B進(jìn)入,B看到的是instance  已經(jīng)不是null了(內(nèi)存已經(jīng)分配),于是它開(kāi)始放心地使用instance,但這個(gè)是錯(cuò)誤的,因?yàn)樵谶@一時(shí)刻,instance的成員變量還都是缺省值,A還沒(méi)有來(lái)得及執(zhí)行步驟2來(lái)完成instance的初始化。

當(dāng)然編譯器也可以這樣實(shí)現(xiàn):

1. temp = 分配內(nèi)存

2. 調(diào)用temp的構(gòu)造函數(shù)

3. instance = temp

如果編譯器的行為是這樣的話我們似乎就沒(méi)有問(wèn)題了,但事實(shí)卻不是那么簡(jiǎn)單,因?yàn)槲覀儫o(wú)法知道某個(gè)編譯器具體是怎么做的,因?yàn)樵贘ava的memory model里對(duì)這個(gè)問(wèn)題沒(méi)有定義。

雙檢鎖對(duì)于基礎(chǔ)類型(比如int)適用。很顯然吧,因?yàn)榛A(chǔ)類型沒(méi)有調(diào)用構(gòu)造函數(shù)這一步。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日本加勒比系列在线播放| 少妇熟女精品一区二区三区| 欧美日韩校园春色激情偷拍| 国产免费自拍黄片免费看| 91天堂免费在线观看| 超碰在线免费公开中国黄片| 老司机精品在线你懂的| 久久亚洲国产视频三级黄| 草草夜色精品国产噜噜竹菊| 国产精品自拍杆香蕉视频| 欧美六区视频在线观看| 91亚洲人人在字幕国产| 视频一区二区 国产精品| 日韩人妻欧美一区二区久久| 中文字幕区自拍偷拍区| 夜夜躁狠狠躁日日躁视频黑人| 情一色一区二区三区四| 国产又粗又深又猛又爽又黄| 欧美一区二区三区播放| 国产成人亚洲综合色就色| 欧美美女视频在线免费看| 日韩欧美三级视频在线| 国产av熟女一区二区三区四区| 久久精品国产在热久久| 日本人妻熟女一区二区三区| 欧美大粗爽一区二区三区| 日韩在线免费看中文字幕| 国产一区二区三区草莓av| 国产一区二区三区草莓av| 日韩aa一区二区三区| 欧美高潮喷吹一区二区| 国产欧美日韩在线精品一二区 | 日韩和欧美的一区二区三区| 国产性色精品福利在线观看| 大香蕉伊人一区二区三区| 欧美日韩精品久久第一页| 精品久久综合日本欧美| 日本二区三区在线播放| 欧美日韩国产一级91| 狠狠做深爱婷婷久久综合| 日韩精品人妻少妇一区二区|