国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java設計模式【單例模式】

這篇具有很好參考價值的文章主要介紹了Java設計模式【單例模式】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Java設計模式【單例模式】

Java設計模式【單例模式】

單例模式

單例模式(Singleton Pattern)是一種創(chuàng)建型設計模式,其主要目的是確保一個類只有一個實例,并提供對該實例的唯一訪問點。

優(yōu)缺點

優(yōu)點:

  1. 提供了對唯一實例的受控訪問。

  2. 由于在系統(tǒng)內(nèi)存中只存在一個對象,因此可以節(jié)約系統(tǒng)資源。

缺點

  1. 單例類的擴展有很大的困難。

  2. 單例類的職責過重,在一定程度上違背了“單一職責原則”。

  3. 對象生命周期。 單例模式?jīng)]有提出對象的銷毀,在提供內(nèi)存的管理的開發(fā)語言中,只有單例模式對象自己才能將對象實例銷毀,因為只有它擁有對實例的引用。 在各種開發(fā)語言中,比如C++,其他類可以銷毀對象實例,但是這么做將導致單例類內(nèi)部的指針指向不明。

單例模式的使用

餓漢模式

  1. 靜態(tài)成員變量
/**
 * @author Physicx
 * @date 2023/5/12 下午10:13
 * @desc 單例
 * Created with IntelliJ IDEA
 */
public class Singleton {

    //初始化實例對象
    private static final Singleton instance = new Singleton();

    //私有化構(gòu)造方法
    private Singleton() {
    }

    //提供獲取實例對象方法
    public static Singleton getInstance() {
        return instance;
    }

}
  1. 靜態(tài)代碼塊
/**
 * @author Physicx
 * @date 2023/5/12 下午10:13
 * @desc 單例
 * Created with IntelliJ IDEA
 */
public class Singleton {

    //實例對象
    private static final Singleton instance;

    static {
        instance = new Singleton();
    }

    //私有化構(gòu)造方法
    private Singleton() {
    }

    //提供獲取實例對象方法
    public static Singleton getInstance() {
        return instance;
    }

}

餓漢式單例的寫法適用于單例對象較少的情況,這樣寫可以保證絕對的線程安全,執(zhí)行效率比較高。但是缺點也很明顯,餓漢式會在類加載的時候就將所有單例對象實例化,這樣系統(tǒng)中如果有大量的餓漢式單例對象的存在,系統(tǒng)初始化的時候會造成大量的內(nèi)存浪費,換句話說就是不管對象用不用,對象都已存在,占用內(nèi)存。

懶漢模式

public class Singleton {

    //實例對象
    private static Singleton instance;

    //私有化構(gòu)造方法
    private Singleton() {
    }

    //提供獲取實例對象方法(線程安全)
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

}

線程安全的一種懶漢式寫法,在類第一次使用的時候初始化,獲取實例的靜態(tài)方法由synchronized修飾,所以是線程安全的。這種方法每次獲取實例對象都加鎖同步,效率較低。

雙重檢測機制(DCL)

public class Singleton {

    //實例對象
    private static volatile Singleton instance;

    //私有化構(gòu)造方法
    private Singleton() {
    }

    //提供獲取實例對象方法
    public static Singleton getInstance() {
        if (instance == null) {
            //加鎖處理
            synchronized (Singleton.class) {
                if (instance==null) {
                    //初始化
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

}

實例對象必須用 volatile 修飾,否則極端情況可能出現(xiàn)安全隱患。

以上初始化對象代碼被編譯后會變成以下三條指令:

  1. 分配對象的內(nèi)存空間。

  2. 初始化對象。

  3. 設置instance指向剛才分配的內(nèi)存空間。

如果按照上面的執(zhí)行順序則不加volatile沒有問題,但是CPU或編譯器為了提高效率,可能會進行指令重排,最終順序變?yōu)椋?/p>

  1. 分配對象的內(nèi)存空間。

  2. 設置instance指向剛才分配的內(nèi)存空間。

  3. 初始化對象。

當兩個線程同時獲取實例對象時,線程A已經(jīng)將instance指向分配空間但未初始化對象,線程B此時第一次判空已不為空,于是返回instance實例,但是此時返回的實例未初始化會導致后續(xù)空指針異常。

DCL這種方式同樣也是類第一次使用的時候初始化,初始化代碼synchronized修飾線程安全,這種方式只會第一次實例對象才會進行同步,因此效率高。

《Java Concurrency in Practice》作者Brian Goetz在書中提到關(guān)于DCL的觀點:促使DCL模式出現(xiàn)的驅(qū)動力(無競爭同步的執(zhí)行速度很慢,以及JVM啟動時很慢)已經(jīng)不復存在,因而它不是一種高效的優(yōu)化措施。延遲初始化占位類模式(靜態(tài)內(nèi)部類)能帶來同樣的優(yōu)勢,并且更容易理解。

靜態(tài)內(nèi)部類(延遲初始化)

public class Singleton {

    //私有化構(gòu)造方法
    private Singleton(){}

    //靜態(tài)內(nèi)部類(被調(diào)用時加載)
    private static class SingletonHandle {
        private static final Singleton instance = new Singleton();
    }

    //提供獲取實例對象方法
    public static Singleton getInstance() {
        return SingletonHandle.instance;
    }

}

利用靜態(tài)內(nèi)部類被調(diào)用時才加載的特性,通過靜態(tài)初始化初始Singleton對象,由于JVM將在初始化期間獲得一個鎖,并且每個線程都至少獲取一次這個鎖以確保這個類已經(jīng)加載,因此在靜態(tài)初始化期間,內(nèi)存寫入操作將自動對所有線程可見。因此無論是在被構(gòu)造期間還是被引用時,靜態(tài)初始化的對象都不需要顯式的同步。

線程安全,效率高,使用的時候才會初始化不浪費內(nèi)存。

《Java Concurrency in Practice》作者Brian Goetz 推薦這種單例實現(xiàn)方式。

枚舉實現(xiàn)方式

除了以上幾種常見的實現(xiàn)方式之外,Google 首席 Java 架構(gòu)師、《Effective Java》一書作者、Java集合框架的開創(chuàng)者Joshua BlochEffective Java一書中提到:單元素的枚舉類型已經(jīng)成為實現(xiàn)Singleton的最佳方法。

在這種實現(xiàn)方式中,既可以避免多線程同步問題;還可以防止通過反射和反序列化來重新創(chuàng)建新的對象。

public class Singleton {

    //私有化構(gòu)造方法
    private Singleton() {}

    enum SingletonEnum {
        SINGLETON;
        private final Singleton instance;

        SingletonEnum() {
            instance = new Singleton();
        }
        //提供獲取實例對象方法
        public Singleton getInstance() {
            return instance;
        }
    }

}

調(diào)用方式如下:

public static void main(String[] args) {
        Singleton instance1 = Singleton.SingletonEnum.SINGLETON.getInstance();
        Singleton instance2 = Singleton.SingletonEnum.SINGLETON.getInstance();
        System.out.println(instance2 == instance1);
    }

普通的單例模式是可以通過反射和序列化/反序列化來破解的,jvm虛擬機會保證枚舉類型不能被反射并且構(gòu)造函數(shù)只被執(zhí)行一次,而Enum由于自身的特性問題,是無法破解的。當然,由于這種情況基本不會出現(xiàn),因此我們在使用單例模式的時候也比較少考慮這個問題。

總結(jié)

實現(xiàn)方式 優(yōu)點 缺點
餓漢模式 線程安全,效率高 非懶加載
懶漢模式 線程安全,懶加載 效率低
雙重檢測機制 線程安全,懶加載,效率高
靜態(tài)內(nèi)部類 線程安全,懶加載,效率高
枚舉 線程安全,效率高 非懶加載

由于單例模式的枚舉實現(xiàn)代碼比較簡單,而且又可以利用枚舉的特性來解決線程安全和單一實例的問題,還可以防止反射和反序列化對單例的破壞,因此在很多書和文章中都強烈推薦將該方法作為單例模式的最佳實現(xiàn)方法。

參考:單例模式詳解(知乎文章)

補充說明

后續(xù)會依次更新 詳解java 23種設計模式,歡迎關(guān)注、交流、補充相關(guān)內(nèi)容(如下)。文章來源地址http://www.zghlxwxcb.cn/news/detail-440825.html

快捷導航
設計模式簡介總結(jié)
單例模式詳解
工廠方法模式
抽象工廠模式

到了這里,關(guān)于Java設計模式【單例模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Java設計模式---單例 工廠 代理模式

    單例模式是設計模式中的一種,屬于創(chuàng)建型模式。在軟件工程中,單例模式確保一個類只有一個實例,并提供一個全局訪問點。這種模式常用于那些需要頻繁實例化然后引用,且創(chuàng)建新實例的開銷較大的類,例如數(shù)據(jù)庫連接池、緩存管理等。 意圖 :保證一個類僅有一個實例

    2024年01月24日
    瀏覽(28)
  • 設計模式篇(Java):單例模式

    設計模式篇(Java):單例模式

    上一篇:設計模式篇(Java):前言(UML類圖、七大原則) 所謂類的單例設計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法(靜態(tài)方法)。 構(gòu)造器私有化 (防止 new ) 類的內(nèi)部創(chuàng)建對象 向外暴露一個靜

    2024年02月11日
    瀏覽(29)
  • java設計模式-單例

    單例模式是一種創(chuàng)建型設計模式,它可以保證一個類只有一個實例,并提供全局訪問點。單例模式在實際開發(fā)中經(jīng)常使用,可以避免多個實例引起的資源浪費和同步問題。常見的java實現(xiàn)方式有多種。 餓漢式單例模式是指在類加載時就創(chuàng)建了單例對象,因此在調(diào)用時不需要再

    2024年01月18日
    瀏覽(25)
  • Java與設計模式(4):單例模式

    單例模式是一種創(chuàng)建型設計模式,它確保一個類只有一個實例,并提供全局訪問點來訪問該實例。 在單例模式中,類的構(gòu)造函數(shù)被私有化,從而禁止外部直接實例化該類。通過一個靜態(tài)方法或靜態(tài)變量來控制類的實例化過程,并返回同一個實例。 單例模式的特點包括: 單一

    2024年02月12日
    瀏覽(27)
  • java設計模式-單例模式(Singleton)

    單例模式(Singleton)就是一個類只能有一個實例,自行實例化,并向系統(tǒng)提供這一實例,這個類就是單例類。單例模式的特點: 一個類只能有一個實例; 單例類自己實例化; 單例類給其它對象提供這個單一實例。 資源管理類經(jīng)常被設計為單例模式,例如管理屬性文件的類。

    2024年02月15日
    瀏覽(19)
  • Java設計模式之單例模式

    Java設計模式之單例模式

    定義:保證一個類僅有一個實例,并提供一個全局訪問點 類型:創(chuàng)建型 想確保任何情況下都絕對只有一個實例 例如:線程池,數(shù)據(jù)庫連接池一般都為單例模式 單例模式優(yōu)點 在內(nèi)存中只有一個實例,減少內(nèi)存開銷 可以避免對資源的多重占用 設置全局訪問點,嚴格控制訪問

    2024年02月02日
    瀏覽(56)
  • Java設計模式(八)— 單例模式3

    Java設計模式(八)— 單例模式3

    單例模式之靜態(tài)內(nèi)部類 單例模式之枚舉方式 單例模式之JDK源碼分析 Hello,小伙伴們,歡迎來到柚子的博客~讓我們一起成長吧o( ̄▽ ̄)ブ 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 代碼如下(示例): 類被裝載的時候,類里面的靜態(tài)內(nèi)部類也是會被裝載的,而且線

    2024年02月09日
    瀏覽(55)
  • 03-JAVA設計模式-單例模式詳解

    03-JAVA設計模式-單例模式詳解

    單例模式(Singleton Pattern)是設計模式中的一種,它確保一個類僅有一個實例,并提供一個全局訪問點來訪問該實例。這種設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 單例模式的應用場景十分廣泛,主要涉及需要頻繁使用某個對象而又不想重復創(chuàng)建的情況

    2024年04月13日
    瀏覽(30)
  • Java——單例設計模式

    Java——單例設計模式

    設計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風格、以及解決問題的思考方式。設計模式免去我們自己再思考和摸索。就像是經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜、“套路”。 經(jīng)典的設計模式共有23種。每個設計模式均是特定環(huán)境下特定問題的

    2024年02月11日
    瀏覽(27)
  • java基礎之設計模式(單例模式,工廠模式)

    是一種編碼套路 單例模式 一個類只能創(chuàng)建一個實例 餓漢式 直接創(chuàng)建唯一實例 缺點: 有可能浪費空間 懶漢式 在獲取實例是創(chuàng)建唯一對象 缺點: 線程效率慢 懶漢式-進階版 在懶漢式的基礎上,利用同步代碼塊結(jié)合二次校驗提高執(zhí)行效率 工廠模式 是一種底層技術(shù),通常用于底層框

    2024年01月18日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包