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

【設(shè)計模式】單例設(shè)計模式

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

目錄

1、前言

2、基本語法

2.1、懶漢式單例

2.2、餓漢式單例

2.3、雙重檢驗鎖單例模式

2.4、靜態(tài)內(nèi)部類單例模式

2.5、枚舉單例模式

2.6、ThreadLocal單例模式

2.7、注冊單例模式

3、使用場景

4、使用示例

5、常見問題

5、總結(jié)

1、前言

單例模式是一種設(shè)計模式,它確保一個類只能創(chuàng)建一個實例,并提供一種全局訪問這個實例的方式。在Java中,單例模式可以通過多種方式來實現(xiàn),其中最常見的是使用私有構(gòu)造函數(shù)和靜態(tài)方法實現(xiàn)

2、基本語法

在Java中,實現(xiàn)單例模式的方式有多種,其中最常見的實現(xiàn)方式包括以下幾種:

2.1、懶漢式單例

懶漢式單例模式指的是在第一次使用單例對象時才創(chuàng)建實例。具體實現(xiàn)方式是在getInstance()方法中判斷實例是否已經(jīng)被創(chuàng)建,如果沒有則創(chuàng)建一個新實例并返回。懶漢式單例模式的缺點是線程不安全,在多線程環(huán)境下可能會創(chuàng)建多個實例。

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有構(gòu)造函數(shù)
    }

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

2.2、餓漢式單例

餓漢式單例模式指的是在類加載時就創(chuàng)建實例,因此也被稱為靜態(tài)單例模式。具體實現(xiàn)方式是將實例化語句放在靜態(tài)代碼塊中。由于在類加載時就創(chuàng)建了實例,因此不存在線程安全性問題。

public class Singleton {
    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // 私有構(gòu)造函數(shù)
    }
    
    public static Singleton getInstance() {
        return instance;
    }
}

2.3、雙重檢驗鎖單例模式

雙重檢驗鎖單例模式是一種線程安全的單例模式實現(xiàn)方式,它通過使用synchronized關(guān)鍵字來確保線程安全性。具體實現(xiàn)方式是在getInstance()方法中添加雙重檢驗鎖,這可以避免不必要的鎖競爭和實例化。

public class Singleton {
    private static volatile Singleton instance;
    
    private Singleton() {
        // 私有構(gòu)造函數(shù)
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

2.4、靜態(tài)內(nèi)部類單例模式

靜態(tài)內(nèi)部類單例模式是一種比較常用的單例模式實現(xiàn)方式,它利用了靜態(tài)內(nèi)部類只會在被使用時才會加載的特點,從而避免了餓漢式單例模式的資源浪費和懶漢式單例模式的線程不安全問題。

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    
    private Singleton() {
        // 私有構(gòu)造函數(shù)
    }
    
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

2.5、枚舉單例模式

枚舉單例模式是一種更為簡單和安全的單例模式實現(xiàn)方式,它利用了Java中枚舉類型本身就是單例的特點。枚舉單例模式是一種天然線程安全的單例模式實現(xiàn)方式,而且可以防止反射和序列化等攻擊。

public enum Singleton {
    INSTANCE;
    
    // 其他方法
}

2.6、ThreadLocal單例模式

ThreadLocal單例模式是一種可以在多線程環(huán)境下確保單例對象的線程安全單例模式實現(xiàn)方式。具體實現(xiàn)方式是在ThreadLocal中保存單例對象,每個線程都有自己的ThreadLocal副本,從而避免了線程安全性問題。

public class Singleton {
    private static final ThreadLocal<Singleton> INSTANCE = new ThreadLocal<Singleton>() {
        @Override
        protected Singleton initialValue() {
            return new Singleton();
        }
    };
    
    private Singleton() {
        // 私有構(gòu)造函數(shù)
    }
    
    public static Singleton getInstance() {
        return INSTANCE.get();
    }
}

2.7、注冊單例模式

注冊式單例模式指的是通過一個注冊表來管理所有單例對象,從而實現(xiàn)單例模式。具體實現(xiàn)方式是在一個靜態(tài)的Map中保存所有單例對象,然后在需要使用單例對象時通過Map來獲取。

public class Singleton {
    private static Map<String, Singleton> instances = new HashMap<>();
    
    private Singleton() {
        // 私有構(gòu)造函數(shù)
    }
    
    public static Singleton getInstance(String name) {
        if (!instances.containsKey(name)) {
            instances.put(name, new Singleton());
        }
        return instances.get(name);
    }
}

3、使用場景

單例模式通常在需要確保全局只有一個實例的場景中使用,例如:

  1. 線程池:在多線程環(huán)境下,線程池需要保證只有一個實例。
  2. 數(shù)據(jù)庫連接池:同樣地,數(shù)據(jù)庫連接池也需要保證只有一個實例。
  3. 日志對象:日志對象通常是全局可見的,因此需要保證只有一個實例。
  4. 配置文件:在某些情況下,需要全局共享的配置文件也需要保證只有一個實例。

4、使用示例

下面是一個簡單的例子,演示如何使用單例模式實現(xiàn)線程池:

public class ThreadPool {
    private static ThreadPool instance;
    
    private ThreadPool() {
        // 初始化線程池
    }
    
    public static synchronized ThreadPool getInstance() {
        if (instance == null) {
            instance = new ThreadPool();
        }
        return instance;
    }
    
    // 線程池相關(guān)的方法
}

在上述代碼中,我們使用synchronized關(guān)鍵字來保證getInstance()方法的線程安全性。這意味著每次只有一個線程可以訪問getInstance()方法,從而避免了多個線程同時創(chuàng)建線程池實例的問題。

5、常見問題

單例模式的實現(xiàn)有一些常見問題,需要注意:

  1. 線程安全性:如上所述,如果多個線程同時訪問getInstance()方法,可能會導(dǎo)致多個實例的創(chuàng)建。因此,需要確保getInstance()方法是線程安全的,可以通過synchronized關(guān)鍵字來實現(xiàn)。
  2. 序列化問題:如果單例類實現(xiàn)了Serializable接口,那么在反序列化時可能會創(chuàng)建多個實例。解決方法是在類中添加readResolve()方法,并返回單例實例。
  3. 反射問題:通過反射機制,可以調(diào)用私有構(gòu)造函數(shù)創(chuàng)建實例。解決方法是在構(gòu)造函數(shù)中添加判斷,如果已經(jīng)存在實例則拋出異常

5、總結(jié)

單例模式是一種非常常用的設(shè)計模式,在多線程環(huán)境下,它可以確保只有一個實例被創(chuàng)建,并提供一種全局訪問這個實例的方式。在Java中,可以通過私有構(gòu)造函數(shù)和靜態(tài)方法實現(xiàn)單例模式。在實現(xiàn)單例模式時,需要注意線程安全性、序列化問題以及反射問題。盡管單例模式非常有用,但也有一些缺點,例如它可能導(dǎo)致代碼變得更加復(fù)雜,而且在多線程環(huán)境下可能會影響性能。因此,在使用單例模式時需要根據(jù)具體情況進(jìn)行權(quán)衡。文章來源地址http://www.zghlxwxcb.cn/news/detail-701623.html

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

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

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

相關(guān)文章

  • Java設(shè)計模式---單例 工廠 代理模式

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

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

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

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

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

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

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

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

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

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

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

    Java設(shè)計模式之單例模式

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

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

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

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

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

    03-JAVA設(shè)計模式-單例模式詳解

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

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

    Java——單例設(shè)計模式

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

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

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

    2024年01月18日
    瀏覽(30)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包