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

Java實(shí)現(xiàn)單例模式的五種方法介紹

 更新時間:2023年01月31日 10:07:24   作者:Knight_AL  
單例模式確保某個類只有一個實(shí)例,而且自行實(shí)例化并向整個系統(tǒng)提供這個實(shí)例。在計(jì)算機(jī)系統(tǒng)中,線程池、緩存、日志對象、對話框、打印機(jī)、顯卡的驅(qū)動程序?qū)ο蟪1辉O(shè)計(jì)成單例

餓漢式

立即加載

防止new對象,構(gòu)造私有,寫一個公共的方法返回對象

占用空間,線程安全

public class Singleton {
    /**
     * 私有構(gòu)造
     */
    private Singleton(){
        System.out.println("構(gòu)造函數(shù)Singleton");
    }
    private static Singleton singleton = new Singleton();
    public static Singleton getInstance(){
        return singleton;
    }
}

懶漢式

延遲加載

占用空間小,效率有問題,線程不安全

public class Singleton {
    /**
     * 私有構(gòu)造
     */
    private Singleton(){
        System.out.println("構(gòu)造函數(shù)Singleton");
    }
    private static Singleton singleton = null;
    public static Singleton getInstance(){
        if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

解決線程安全問題

在方法上加synchronized同步鎖或是用同步代碼塊對類加同步鎖,此種方式雖然解決了多個實(shí)例對象問題,但是該方式運(yùn)行效率卻很低下,下一個線程想要獲取對象,就必須等待上一個線程釋放鎖之后,才可以繼續(xù)運(yùn)行。

鎖太大

public class Singleton {
    /**
     * 私有構(gòu)造
     */
    private Singleton(){
        System.out.println("構(gòu)造函數(shù)Singleton");
    }
    private static Singleton singleton = null;
    public static synchronized Singleton getInstance(){
        if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

雙重檢查鎖

提高同步鎖的效率

使用雙重檢查鎖進(jìn)一步做了優(yōu)化,可以避免整個方法被鎖,只對需要鎖的代碼部分加鎖,可以提高執(zhí)行效率。

第一個if判斷

第一個線程進(jìn)來new了Singleton,那么singleton就有值,第二個線程進(jìn)來,那么進(jìn)行第一個if判斷,不為null,直接返回,不用再去new了,提升了效率

第二個if判斷

兩個線程同時進(jìn)來,在synchronized,第一個線程進(jìn)入,另一個線程等待,第一個線程new Singleton,然后返回,另一個線程發(fā)現(xiàn)了第一個線程走了,進(jìn)入synchronized,如果不進(jìn)行if判斷,那么還會new Singleton,導(dǎo)致線程不安全

public class Singleton {
    /**
     * 私有構(gòu)造
     */
    private Singleton(){
        System.out.println("構(gòu)造函數(shù)Singleton");
    }
    private static Singleton singleton = null;
    public static synchronized Singleton getInstance(){
        if (singleton == null){  //這個檢查是提高效率的
            synchronized (Singleton.class){
                if (singleton == null){
                    singleton = new Singleton();   //這個檢查是防止線程安全的
                }
            }
        }
        return singleton;
    }
}

靜態(tài)內(nèi)部類

這種方式引入了一個內(nèi)部靜態(tài)類(static class),靜態(tài)內(nèi)部類只有在調(diào)用時才會加載,它保證了Singleton 實(shí)例的延遲初始化,又保證了實(shí)例的唯一性。它把singleton 的實(shí)例化操作放到一個靜態(tài)內(nèi)部類中,在第一次調(diào)用getInstance() 方法時,JVM才會去加載InnerObject類,同時初始化singleton 實(shí)例,所以能讓getInstance() 方法線程安全。

特點(diǎn)是:即能延遲加載,也能保證線程安全。

靜態(tài)內(nèi)部類雖然保證了單例在多線程并發(fā)下的線程安全性,但是在遇到序列化對象時,默認(rèn)的方式運(yùn)行得到的結(jié)果就是多例的。

public class Singleton {
    /**
     * 私有構(gòu)造
     */
    private Singleton(){
    }
    private static class InnerObject{
        private static Singleton singleton = new Singleton();
    }
    public static synchronized Singleton getInstance(){
        return InnerObject.singleton;
    }
}

內(nèi)部枚舉類實(shí)現(xiàn)

防止反射和反序列化攻擊

實(shí)上,通過Java反射機(jī)制是能夠?qū)嵗瘶?gòu)造方法為private的類的。這也就是我們現(xiàn)在需要引入的枚舉單例模式。

public class SingletonFactory {
    /**
     * 私有構(gòu)造
     */
    private enum EnumSingleton{
        SINGLETON;
        private Singleton6 singleton;
        //枚舉類的構(gòu)造方法在類加載是被實(shí)例化
        private EnumSingleton(){
            singleton = new Singleton6();
        }
        public Singleton6 getInstance(){
            return singleton;
        }
    }
    public static Singleton6 getInstance(){
        return EnumSingleton.SINGLETON.getInstance();
    }
}
class Singleton6{
    public Singleton6(){
    }
}

到此這篇關(guān)于Java實(shí)現(xiàn)單例模式的五種方法介紹的文章就介紹到這了,更多相關(guān)Java單例模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java 多線程-線程通信實(shí)例講解

    java 多線程-線程通信實(shí)例講解

    本文主要介紹java 多線程-線程通信 這里整理了相關(guān)資料及示例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • Spring面向切面編程AOP詳情

    Spring面向切面編程AOP詳情

    這篇文章主要介紹了Spring面向切面編程AOP詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Java實(shí)戰(zhàn)之小米交易商城系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之小米交易商城系統(tǒng)的實(shí)現(xiàn)

    這篇文章將利用Java實(shí)現(xiàn)小米交易商城系統(tǒng),文中采用的技術(shù)有:JSP?、Spring、SpringMVC、MyBatis等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-04-04
  • 詳解java迭代器模式

    詳解java迭代器模式

    這篇文章主要介紹了java迭代器模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java踩坑記錄之Arrays.AsList

    Java踩坑記錄之Arrays.AsList

    這篇文章主要給大家介紹了關(guān)于Java踩坑記錄之Arrays.AsList的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • mybatis-plus查詢無數(shù)據(jù)問題及解決

    mybatis-plus查詢無數(shù)據(jù)問題及解決

    這篇文章主要介紹了mybatis-plus查詢無數(shù)據(jù)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java實(shí)現(xiàn)的最大匹配分詞算法詳解

    Java實(shí)現(xiàn)的最大匹配分詞算法詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)的最大匹配分詞算法,簡單說明了最大匹配分詞算法的原理并結(jié)合具體實(shí)例形式最大匹配分詞算法的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-09-09
  • java中SPI服務(wù)提供者的接口使用總結(jié)

    java中SPI服務(wù)提供者的接口使用總結(jié)

    SPI英文全稱為Service?Provider?Interface,顧名思義,服務(wù)提供者接口,它是jdk提供給“服務(wù)提供廠商”或者“插件開發(fā)者”使用的接口
    2022-02-02
  • java連接數(shù)據(jù)庫的5種方式解讀

    java連接數(shù)據(jù)庫的5種方式解讀

    這篇文章主要介紹了java連接數(shù)據(jù)庫的5種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教<BR>
    2024-04-04
  • Lock、Condition實(shí)現(xiàn)簡單的生產(chǎn)者消費(fèi)者模式示例

    Lock、Condition實(shí)現(xiàn)簡單的生產(chǎn)者消費(fèi)者模式示例

    這篇文章主要介紹了Lock、Condition實(shí)現(xiàn)簡單的生產(chǎn)者消費(fèi)者模式示例,需要的朋友可以參考下
    2014-04-04

最新評論

大荔县| 苗栗县| 财经| 临颍县| 宣威市| 西吉县| 大渡口区| 关岭| 龙井市| 莱阳市| 桦川县| 高阳县| 景泰县| 中西区| 金昌市| 昌乐县| 乌拉特后旗| 高陵县| 贡觉县| 桐柏县| 沙雅县| 卢氏县| 伊宁县| 杭州市| 清河县| 金乡县| 奇台县| 二手房| 郧西县| 阿拉善右旗| 米脂县| 鲁山县| 翼城县| 常德市| 堆龙德庆县| 永昌县| 满城县| 咸宁市| 贵阳市| 高台县| 肃宁县|