成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

單例模式(Singleton)

RyanQ / 2867人閱讀

摘要:懶漢式單例模式單例類(lèi)測(cè)試類(lèi)輸出實(shí)現(xiàn)方式構(gòu)造方法私有化。存在問(wèn)題線程不安全,如果多個(gè)線程同時(shí)訪問(wèn),仍會(huì)產(chǎn)生多個(gè)實(shí)例對(duì)象。

一般實(shí)現(xiàn)

創(chuàng)建執(zhí)行方法

public class WithoutSingleton {
    public static void withoutSingletonInfo(WithoutSingleton withoutSingleton){
        System.out.println("WithoutSingleton.hashCode = " + withoutSingleton.hashCode());
    }
}

測(cè)試類(lèi)

    public static void main(String[] args) {
        WithoutSingleton withoutSingleton = new WithoutSingleton();
        WithoutSingleton.withoutSingletonInfo(withoutSingleton);
        WithoutSingleton withoutSingleton2 = new WithoutSingleton();
        WithoutSingleton.withoutSingletonInfo(withoutSingleton2);
        WithoutSingleton withoutSingleton3 = new WithoutSingleton();
        WithoutSingleton.withoutSingletonInfo(withoutSingleton3);
    }

輸出

WithoutSingleton.hashCode = 2083479002
WithoutSingleton.hashCode = 163238632
WithoutSingleton.hashCode = 1215070805

問(wèn)題
每次生成的類(lèi)的實(shí)例對(duì)象都是不同的,但是在一些特定的場(chǎng)合,需要每次返回的實(shí)例對(duì)象都是同一個(gè),如:sping中創(chuàng)建bean。

懶漢式單例模式

單例類(lèi)

public class LazySingleton {
    private static LazySingleton lazySingleton = null;
    private LazySingleton(){
    }
    public static LazySingleton getInstance(){
        if(lazySingleton == null){
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }
    public static void singletonInfo(){
        System.out.println("lazySingleton.hashCode = " + lazySingleton.hashCode());
    }
}
測(cè)試類(lèi):
    public static void main(String[] args) {
        LazySingleton lazySingleton = LazySingleton.getInstance();
        lazySingleton.singletonInfo();
        LazySingleton lazySingleton2 = LazySingleton.getInstance();
        lazySingleton2.singletonInfo();
        LazySingleton lazySingleton3 = LazySingleton.getInstance();
        lazySingleton3.singletonInfo();
    }
輸出:
lazySingleton.hashCode = 1110594262
lazySingleton.hashCode = 1110594262
lazySingleton.hashCode = 1110594262

實(shí)現(xiàn)方式

構(gòu)造方法私有化。

存在問(wèn)題

線程不安全,如果多個(gè)線程同時(shí)訪問(wèn),仍會(huì)產(chǎn)生多個(gè)實(shí)例對(duì)象。

解決方法
1.在getInstance()方法上同步synchronized(同步對(duì)性能有影響)
2.雙重檢查鎖定
3.靜態(tài)內(nèi)部類(lèi)

餓漢式單例模式

代碼實(shí)現(xiàn)

public class HungrySingleton {
    private static HungrySingleton hungrySingleton = new HungrySingleton();
    private HungrySingleton(){
    }
    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }
    public static void singletonInfo(){
        System.out.println("hungrySingleton.hashCode = " + hungrySingleton.hashCode());
    }
}

輸出

hungrySingleton.hashCode = 1977385357
hungrySingleton.hashCode = 1977385357
hungrySingleton.hashCode = 1977385357

說(shuō)明
靜態(tài)成員變量在類(lèi)加載的時(shí)候就會(huì)創(chuàng)建實(shí)例對(duì)象,解決了線程不安全問(wèn)題

缺點(diǎn)
類(lèi)加載時(shí)就創(chuàng)建實(shí)例對(duì)象,會(huì)占用系統(tǒng)內(nèi)存,如果存在大量單例類(lèi)(一般不會(huì)出現(xiàn)),或者創(chuàng)建的類(lèi)并沒(méi)有使用,會(huì)造成內(nèi)存浪費(fèi)。

源碼

https://github.com/Seasons20/DisignPattern.git

END

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69245.html

相關(guān)文章

  • Java設(shè)計(jì)模式-單例模式Singleton Pattern)

    摘要:如果需要防范這種攻擊,請(qǐng)修改構(gòu)造函數(shù),使其在被要求創(chuàng)建第二個(gè)實(shí)例時(shí)拋出異常。單例模式與單一職責(zé)原則有沖突。源碼地址參考文獻(xiàn)設(shè)計(jì)模式之禪 定義 單例模式是一個(gè)比較簡(jiǎn)單的模式,其定義如下: 保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。 或者 Ensure a class has only one instance, and provide a global point of ac...

    k00baa 評(píng)論0 收藏0
  • Java 設(shè)計(jì)模式單例模式

    摘要:在設(shè)計(jì)模式一書(shū)中,將單例模式稱(chēng)作單件模式。通過(guò)關(guān)鍵字,來(lái)保證不會(huì)同時(shí)有兩個(gè)線程進(jìn)入該方法的實(shí)例對(duì)象改善多線程問(wèn)題為了符合大多數(shù)程序,很明顯地,我們需要確保單例模式能在多線程的情況下正常工作。 在《Head First 設(shè)計(jì)模式》一書(shū)中,將單例模式稱(chēng)作單件模式。這里為了適應(yīng)大環(huán)境,把它稱(chēng)之為大家更熟悉的單例模式。 一、了解單例模式 1.1 什么是單例模式 單例模式確保一個(gè)類(lèi)只有一個(gè)實(shí)例,...

    everfight 評(píng)論0 收藏0
  • Android中的設(shè)計(jì)模式單例模式

    摘要:總結(jié)單例是運(yùn)用頻率很高的模式,因?yàn)榭蛻舳藳](méi)有高并發(fā)的情況,選擇哪種方式并不會(huì)有太大的影響,出于效率考慮,推薦使用和靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)單例模式。 單例模式介紹 單例模式是應(yīng)用最廣的模式之一,也可能是很多人唯一會(huì)使用的設(shè)計(jì)模式。在應(yīng)用單例模式時(shí),單例對(duì)象的類(lèi)必須保證只用一個(gè)實(shí)例存在。許多時(shí)候整個(gè)系統(tǒng)只需要一個(gè)全局對(duì)象,這樣有利于我么能協(xié)調(diào)整個(gè)系統(tǒng)整體的行為。 單例模式的使用場(chǎng)景 確保某個(gè)類(lèi)有且...

    yzd 評(píng)論0 收藏0
  • 設(shè)計(jì)模式--單例模式

    摘要:雙重檢查鎖單例模式懶漢單例模式中,我們并不需要整個(gè)方法都是同步的,我們只需要確保再創(chuàng)建的時(shí)候,進(jìn)行同步即可。單例模式的缺點(diǎn)優(yōu)點(diǎn)在開(kāi)頭已經(jīng)說(shuō)明了,單例模式的缺點(diǎn)在于它一般沒(méi)有接口,擴(kuò)展困難,基本上修改源代碼是擴(kuò)展單例模式的唯一方法。 單例模式 定義: 確保某一個(gè)類(lèi)只有一個(gè)實(shí)例對(duì)象,并且該對(duì)象是自行實(shí)例化的,通過(guò)統(tǒng)一的接口向整個(gè)系統(tǒng)提供這個(gè)實(shí)例對(duì)象。 使用場(chǎng)景: 避免產(chǎn)生多個(gè)對(duì)象消耗過(guò)多的...

    luxixing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<