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

Java單例模式的6種實現(xiàn)方式詳解

 更新時間:2021年09月29日 11:25:25   作者:Skyper  
這篇文章主要介紹了Java單例模式的6種實現(xiàn)方式的相關資料,需要的朋友可以參考下,希望能夠給你帶來幫助

為什么使用單例模式

需要確保某個類只要一個對象,或創(chuàng)建一個類需要消耗的資源過多,如訪問IO和數(shù)據(jù)庫操作等,這時就需要考慮使用單例模式了。

使用單例模式需要注意的關鍵點

  • 將構(gòu)造函數(shù)訪問修飾符設置為private
  • 通過一個靜態(tài)方法或者枚舉返回單例類對象
  • 確保單例類的對象有且只有一個,特別是在多線程環(huán)境下
  • 確保單例類對象在反序列化時不會重新構(gòu)建對象

單例模式的幾種寫法

1. 餓漢式

/**
 * 餓漢式實現(xiàn)單例模式
 */
public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
        return instance;
    }
}

2. 懶漢式

/**
 * 懶漢式實現(xiàn)單例模式
 */
public class Singleton {
    private static Singleton instance;
    private Singleton() {
    }
    // synchronized方法,多線程情況下保證單例對象唯一
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

getInstance()方法中添加了synchronized關鍵字,使其變成一個同步方法,目的是為了在多線程環(huán)境下保證單例對象唯一。

優(yōu)點: 只有在使用時才會實例化單例,一定程度上節(jié)約了資源。

缺點: 第一次加載時要立即實例化,反應稍慢。每次調(diào)用getInstance()方法都會進行同步,這樣會消耗不必要的資源。這種模式一般不建議使用。

3. DCL(Double CheckLock)實現(xiàn)單例

/**
 * DCL實現(xiàn)單例模式
 */
public class Singleton {
    private static Singleton instance = null;
    private Singleton() {
    }
    public static Singleton getInstance() {
        // 兩層判空,第一層是為了避免不必要的同步
        // 第二層是為了在null的情況下創(chuàng)建實例
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

優(yōu)點: 資源利用率高,既能夠在需要的時候才初始化實例,又能保證線程安全,同時調(diào)用getInstance()方法不進行同步鎖,效率高。

缺點: 第一次加載時稍慢,由于Java內(nèi)存模型的原因偶爾會失敗。在高并發(fā)環(huán)境下也有一定的缺陷,雖然發(fā)生概率很小。
DCL模式是使用最多的單例模式實現(xiàn)方式,除非代碼在并發(fā)場景比較復雜或者JDK 6以下版本使用,否則,這種方式基本都能滿足需求。

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

/**
 * 靜態(tài)內(nèi)部類實現(xiàn)單例模式
 */
public class Singleton {
    private Singleton() {
    }
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
    /**
     * 靜態(tài)內(nèi)部類
     */
    private static class SingletonHolder {
        private static Singleton instance = new Singleton();
    }
}

第一次加載Singleton類時不會初始化instance,只有在第一次調(diào)用getInstance()方法時,虛擬機會加載SingletonHolder類,初始化instance。

這方式既保證線程安全,單例對象的唯一,也延遲了單例的初始化,推薦使用這種方式來實現(xiàn)單例模式。

5. 枚舉單例

/**
 * 枚舉實現(xiàn)單例模式
 */
public enum SingletonEnum {
    INSTANCE;
    public void doSomething() {
        System.out.println("do something");
    }
}

默認枚舉實例的創(chuàng)建是線程安全的,即使反序列化也不會生成新的實例,任何情況下都是一個單例。

優(yōu)點: 簡單!

6. 容器實現(xiàn)單例

import java.util.HashMap;
import java.util.Map;
/**
 * 容器類實現(xiàn)單例模式
 */
public class SingletonManager {
    private static Map<String, Object> objMap = new HashMap<String, Object>();
    public static void regsiterService(String key, Object instance) {
        if (!objMap.containsKey(key)) {
            objMap.put(key, instance);
        }
    }
    public static Object getService(String key) {
        return objMap.get(key);
    }
}

SingletonManager可以管理多個單例類型,使用時根據(jù)key獲取對象對應類型的對象。這種方式可以通過統(tǒng)一的接口獲取操作,隱藏了具體實現(xiàn),降低了耦合度。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!

相關文章

  • 通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問

    通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問

    這篇文章主要介紹了通過MyBatis讀取數(shù)據(jù)庫數(shù)據(jù)并提供rest接口訪問 的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • Intellij Idea新建SpringBoot項目方式

    Intellij Idea新建SpringBoot項目方式

    這篇文章主要介紹了Intellij Idea新建SpringBoot項目方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 關于在Springboot中集成unihttp后應用無法啟動的解決辦法

    關于在Springboot中集成unihttp后應用無法啟動的解決辦法

    本文主要介紹了在SpringBoot項目中集成UniHttp框架時遇到的無法啟動問題,并提供了解決方法,作者通過詳細記錄和分析問題,希望為其他開發(fā)者提供有價值的參考和借鑒,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • Java實現(xiàn)的DES加密解密工具類實例

    Java實現(xiàn)的DES加密解密工具類實例

    這篇文章主要介紹了Java實現(xiàn)的DES加密解密工具類,結(jié)合具體實例形式分析了Java實現(xiàn)的DES加密解密工具類定義與使用方法,需要的朋友可以參考下
    2017-09-09
  • Java實現(xiàn)導出Excel功能

    Java實現(xiàn)導出Excel功能

    通過java中Controller層,來接受請求,數(shù)據(jù)庫查詢到的數(shù)據(jù)進行封裝,然后使用ExcelUtils進行輸出,接下來通過本文給大家分享Java實現(xiàn)導出Excel功能的實例代碼,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • 淺談Java設計模式系列-裝飾器模式

    淺談Java設計模式系列-裝飾器模式

    這篇文章主要介紹了Java設計模式系列-裝飾器模式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 深入理解Spring中的循環(huán)依賴

    深入理解Spring中的循環(huán)依賴

    Spring在注入bean的時候會做循環(huán)依賴檢查,下面這篇文章主要給大家介紹了關于Spring中循環(huán)依賴的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2018-05-05
  • Java編程中的vector類用法學習筆記

    Java編程中的vector類用法學習筆記

    Vector通常被用來實現(xiàn)動態(tài)數(shù)組,即可實現(xiàn)自動增長的對象數(shù)組,和C++一樣vector類同樣被Java內(nèi)置,下面就來看一下vector類的基本用法.
    2016-05-05
  • Springboot安全框架整合SpringSecurity實現(xiàn)方式

    Springboot安全框架整合SpringSecurity實現(xiàn)方式

    這篇文章主要介紹了Spring全家桶中Springboot安全框架整合SpringSecurity的實現(xiàn)方式,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • 探討:使用httpClient在客戶端與服務器端傳輸對象參數(shù)的詳解

    探討:使用httpClient在客戶端與服務器端傳輸對象參數(shù)的詳解

    本篇文章是對使用httpClient在客戶端與服務器端傳輸對象參數(shù)進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06

最新評論

进贤县| 兴国县| 千阳县| 长白| 澄江县| 新民市| 芜湖市| 菏泽市| 阿拉善左旗| 富裕县| 丹阳市| 闵行区| 武宁县| 福清市| 农安县| 榆社县| 杂多县| 曲水县| 沙洋县| 普格县| 黄冈市| 化德县| 永宁县| 河源市| 宝兴县| 广饶县| 车险| 合阳县| 祁东县| 甘南县| 出国| 个旧市| 永康市| 庄浪县| 枣庄市| 金平| 女性| 肇庆市| 托克逊县| 阿勒泰市| 南充市|