最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之單例模式簡(jiǎn)單解析

 更新時(shí)間:2023年12月16日 09:41:52   作者:小晨想好好學(xué)習(xí)  
這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式簡(jiǎn)單解析,單例模式的優(yōu)點(diǎn)在于在內(nèi)存中某個(gè)類只有一個(gè)實(shí)例,減少了內(nèi)存的開(kāi)銷,尤其是頻繁的創(chuàng)建和銷毀實(shí)例,避免對(duì)資源的多重暫用,需要的朋友可以參考下

單例模式的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 在內(nèi)存中某個(gè)類只有一個(gè)實(shí)例,減少了內(nèi)存的開(kāi)銷,尤其是頻繁的創(chuàng)建和銷毀實(shí)例
  • 避免對(duì)資源的多重暫用

缺點(diǎn): 沒(méi)有接口,不能繼承

單例模式的幾種實(shí)現(xiàn)方式

1、餓漢式(線程安全)

類加載時(shí)就初始化實(shí)例,避免了多線程同步問(wèn)題,天然線程安全。

為什么餓漢式是線程安全的? 類加載的方式是按需加載,且只加載一次。因此,在上述單例類被加載時(shí),就會(huì)實(shí)例化一個(gè)對(duì)象并交給自己的引用,供系統(tǒng)使用,即在線程訪問(wèn)單例對(duì)象之前,其就已經(jīng)創(chuàng)建好了。線程每次都只能拿到這個(gè)唯一的對(duì)象。因此,餓漢式單例天生就是線程安全的。

class Singleton{
    //1、私有化構(gòu)造器,這樣外部就不能通過(guò)構(gòu)造器來(lái)創(chuàng)建對(duì)象
    private Singleton(){
    }
    //2、本類內(nèi)部創(chuàng)建對(duì)象實(shí)例
    private final static Singleton instance = new Singleton();
    //3、對(duì)外提供一個(gè)共有的靜態(tài)方法,返回對(duì)象實(shí)例
    public static Singleton getInstance(){
        return instance;
    }
}

2、餓漢式(靜態(tài)代碼塊方式)

class Singleton{
    //1、私有化構(gòu)造器,這樣外部就不能通過(guò)構(gòu)造器來(lái)創(chuàng)建對(duì)象
    private Singleton(){
    }
    //2、本類內(nèi)部創(chuàng)建對(duì)象實(shí)例
    private static Singleton instance;
    //3、在靜態(tài)代碼塊中創(chuàng)建單例對(duì)象
    static {
        instance = new Singleton();
    }
    //4、對(duì)外提供一個(gè)共有的靜態(tài)方法,返回對(duì)象實(shí)例
    public static Singleton getInstance(){
        return instance;
    }
}

3、懶漢式(線程不安全)

實(shí)例對(duì)象在第一次被調(diào)用的時(shí)候才真正構(gòu)建的,而不是程序一啟動(dòng)就會(huì)自動(dòng)構(gòu)建。這種實(shí)現(xiàn)最大的問(wèn)題就是不支持多線程,因?yàn)闆](méi)有加鎖 ,多線程場(chǎng)景下不要使用,因?yàn)榭赡軙?huì)產(chǎn)生多個(gè)對(duì)象,不再是單例

class Singleton{
    private static Singleton instance;
    private Singleton(){};
    //提供一個(gè)靜態(tài)的公有方法,當(dāng)使用到該方法時(shí),才會(huì)去創(chuàng)建instance
    public static Singleton getInstance(){
        if(instance==null){
            instance = new Singleton();
        }
        return instance;
    }
}

4、懶漢式+鎖 實(shí)現(xiàn)多線程安全的單例模式

每次獲取實(shí)例時(shí),也需要等待其他線程的鎖釋放,效率低

class Singleton{
    private static Singleton instance;
    private Singleton(){};
    //提供一個(gè)靜態(tài)的公有方法,當(dāng)使用到該方法時(shí),才會(huì)去創(chuàng)建instance
    public static synchronized Singleton getInstance(){
        if(instance==null){
            instance = new Singleton();
        }
        return instance;
    }
}

5、double-check locking實(shí)現(xiàn)單例模式

多個(gè)線程只在創(chuàng)建實(shí)例的時(shí)候加鎖實(shí)現(xiàn)同步

class Singleton{
    // volatile: 輕量級(jí)的synchronized, 由它修飾的變量在發(fā)生變化后會(huì)立即刷新到主存
    private static volatile Singleton instance;
    private Singleton(){};
    public static Singleton getInstance(){
        if(instance==null){
            synchronized (Singleton.class){
                if(instance==null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

【注意】instance為什么需要采? volatile 關(guān)鍵字修飾?

instance采? volatile 關(guān)鍵字修飾也是很有必要的,在上述代碼中有下面這一句代碼

instance= SingletonDCL();

其實(shí)是分為三步執(zhí)?的:

1.為 instance 分配內(nèi)存空間

2. 初始化 instance

3. 將 instance指向分配的內(nèi)存地址

但是由于 JVM 具有指令重排的特性,執(zhí)?順序有可能變成 1->3->2。指令重排在單線程環(huán)境下不會(huì)出現(xiàn)問(wèn)題,但是在多線程環(huán)境下會(huì)導(dǎo)致?個(gè)線程獲得還沒(méi)有初始化的實(shí)例。

例如,線程A 執(zhí)?了 1 和3,此時(shí)線程B調(diào)? getInstance() 后發(fā)現(xiàn) instance不為空,因此返回instance,但此時(shí)instance還未被初始化,使? volatile 可以禁? JVM 的指令重排 ,保證在多線程環(huán)境下也能正常運(yùn)?。

到此這篇關(guān)于Java設(shè)計(jì)模式之單例模式簡(jiǎn)單解析的文章就介紹到這了,更多相關(guān)Java的單例模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決Spring security5.5.7報(bào)錯(cuò)Encoded password does not look like BCrypt異常

    解決Spring security5.5.7報(bào)錯(cuò)Encoded password does

    這篇文章主要介紹了解決Spring security5.5.7出現(xiàn)Encoded password does not look like BCrypt異常問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java8中接口的新特性測(cè)試

    Java8中接口的新特性測(cè)試

    今天小編就為大家分享一篇關(guān)于Java8中接口的新特性測(cè)試,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • java藍(lán)橋杯試題

    java藍(lán)橋杯試題

    這篇文章主要介紹了java藍(lán)橋杯試題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • SpringMVC文件上傳的配置實(shí)例詳解

    SpringMVC文件上傳的配置實(shí)例詳解

    本文通過(guò)實(shí)例代碼給大家介紹SpringMVC文件上傳的配置相關(guān)內(nèi)容,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • springboot 中異步任務(wù),定時(shí)任務(wù),郵件任務(wù)詳解

    springboot 中異步任務(wù),定時(shí)任務(wù),郵件任務(wù)詳解

    這篇文章主要介紹了springboot 與異步任務(wù),定時(shí)任務(wù),郵件任務(wù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Spring TransactionalEventListener事務(wù)未提交讀取不到數(shù)據(jù)的解決

    Spring TransactionalEventListener事務(wù)未提交讀取不到數(shù)據(jù)的解決

    這篇文章主要介紹了Spring TransactionalEventListener事務(wù)未提交讀取不到數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中的動(dòng)態(tài)代理實(shí)現(xiàn)代碼實(shí)例

    Java中的動(dòng)態(tài)代理實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了Java中的動(dòng)態(tài)代理實(shí)現(xiàn)代碼實(shí)例,jdk動(dòng)態(tài)代理本質(zhì)上是使用被代理對(duì)象的類加載器,通過(guò)被代理類實(shí)現(xiàn)的接口在運(yùn)行時(shí)動(dòng)態(tài)構(gòu)造出代理類來(lái)增強(qiáng)原始類的功能的方法,需要的朋友可以參考下
    2023-12-12
  • jdk動(dòng)態(tài)代理源碼分析過(guò)程

    jdk動(dòng)態(tài)代理源碼分析過(guò)程

    這篇文章主要介紹了jkd動(dòng)態(tài)代理源碼分析過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Java并發(fā)之Semaphore工具類r的全面解析

    Java并發(fā)之Semaphore工具類r的全面解析

    Semaphore 是 java.util.concurrent中非常有用的并發(fā)編程工具類,它通常被用于限制對(duì)某個(gè)資源或資源池的并發(fā)訪問(wèn)數(shù)量,下面我們就來(lái)深入了解一下Semaphore的具體使用吧
    2024-02-02
  • 解決Mybatis中mapper的ID沖突問(wèn)題

    解決Mybatis中mapper的ID沖突問(wèn)題

    這篇文章主要介紹了解決Mybatis中mapper的ID沖突問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

黎城县| 拉孜县| 邹城市| 苏州市| 当涂县| 定远县| 永修县| 通山县| 揭西县| 三原县| 台中县| 古田县| 蕉岭县| 顺义区| 仪征市| 伊宁市| 卫辉市| 南汇区| 通渭县| 鄢陵县| 紫阳县| 安义县| 孟津县| 西城区| 晋州市| 涪陵区| 从江县| 兖州市| 肇东市| 惠安县| 太白县| 塔河县| 南充市| 绥阳县| 阳江市| 上思县| 扎鲁特旗| 甘孜县| 班玛县| 阿瓦提县| 江门市|