欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)線程安全單例模式的五種方式的示例代碼

 更新時(shí)間:2022年03月29日 10:31:54   作者:gonghr  
這篇文章主要介紹了Java中實(shí)現(xiàn)線程安全單例模式的五種方式:餓漢式、枚舉單例、懶漢式、DCL懶漢式和靜態(tài)內(nèi)部類(lèi)懶漢單例,感興趣的可以了解一下

餓漢式

餓漢式:類(lèi)加載就會(huì)導(dǎo)致該單實(shí)例對(duì)象被創(chuàng)建

// 問(wèn)題1:為什么加 final
// 問(wèn)題2:如果實(shí)現(xiàn)了序列化接口, 還要做什么來(lái)防止反序列化破壞單例
public final class Singleton_hungry implements Serializable {

    // 問(wèn)題3:為什么設(shè)置為私有? 是否能防止反射創(chuàng)建新的實(shí)例?
    private Singleton_hungry(){}

    // 問(wèn)題4:這樣初始化是否能保證單例對(duì)象創(chuàng)建時(shí)的線程安全?
    private static Singleton_hungry INSTANCE = new Singleton_hungry();

    // 問(wèn)題5:為什么提供靜態(tài)方法而不是直接將 INSTANCE 設(shè)置為 public, 說(shuō)出你知道的理由
    public static Singleton_hungry getInstance() {
        return INSTANCE;
    }
    public Object readResolve(){  // 防止反射創(chuàng)建新的實(shí)例?
        return INSTANCE;
    }
}
  • 問(wèn)題1:避免子類(lèi)覆蓋父類(lèi)的一些方法,導(dǎo)致線程不安全。
  • 問(wèn)題2:實(shí)現(xiàn) readResolve 方法。當(dāng)從對(duì)象流 ObjectInputStream 中讀取對(duì)象時(shí),會(huì)檢查對(duì)象的類(lèi)否定義了 readResolve 方法。如果定義了,則調(diào)用它返回我們想指定的對(duì)象(這里就指定了返回單例對(duì)象)。
  • 問(wèn)題3:防止通過(guò) new 創(chuàng)建對(duì)象實(shí)例。不能防止反射創(chuàng)建新的實(shí)例。
  • 問(wèn)題4:可以。靜態(tài)變量初始化在類(lèi)加載時(shí)進(jìn)行,由 jvm 進(jìn)行管理,可以保證線程安全。
  • 問(wèn)題5:通過(guò)方法,可以提高拓展性,改進(jìn)餓漢式轉(zhuǎn)化為懶漢式、利用泛型特性、增加對(duì)單例對(duì)象的控制操作。

枚舉單例

enum Singleton { 
   INSTANCE; 
}

問(wèn)題1:枚舉單例是如何限制實(shí)例個(gè)數(shù)的

單例相當(dāng)于枚舉的靜態(tài)成員變量,定義幾個(gè)就有幾個(gè)實(shí)例。

問(wèn)題2:枚舉單例在創(chuàng)建時(shí)是否有并發(fā)問(wèn)題

單例相當(dāng)于枚舉的靜態(tài)成員變量,類(lèi)加載時(shí)初始化,由 jvm 進(jìn)行管理,可以保證線程安全。

問(wèn)題3:枚舉單例能否被反射破壞單例

不能

問(wèn)題4:枚舉單例能否被反序列化破壞單例

枚舉實(shí)現(xiàn)了 Serializable 接口,可序列化,但不會(huì)被反序列破壞單例。

問(wèn)題5:枚舉單例屬于懶漢式還是餓漢式

餓漢式

問(wèn)題6:枚舉單例如果希望加入一些單例創(chuàng)建時(shí)的初始化邏輯該如何做

枚舉允許構(gòu)造方法

懶漢式

public final class Singleton_lazy {
    private Singleton_lazy(){}
    private static Singleton_lazy INSTANCE = null;
    // 缺點(diǎn)
    public static synchronized Singleton_lazy getInstance() {
        if(INSTANCE != null) {
            return INSTANCE;
        }
        INSTANCE = new Singleton_lazy();
        return INSTANCE;
    }
}

synchronized 保證線程安全,但鎖粒度較大,性能低。

DCL 懶漢式

public final class Singleton_DCL {

    private Singleton_DCL() {}

    // 問(wèn)題1:解釋為什么要加 volatile ?
    private static volatile Singleton_DCL INSTANCE= null;

    // 問(wèn)題2:對(duì)比實(shí)現(xiàn)3, 說(shuō)出這樣做的意義
    public static Singleton_DCL getInstance() {
        if(INSTANCE != null) {
            return INSTANCE;
        }
        synchronized (Singleton_DCL.class) {
          
            // 問(wèn)題3:為什么還要在這里加為空判斷, 之前不是判斷過(guò)了嗎
            if(INSTANCE != null) {
                return INSTANCE;
            }
            INSTANCE = new Singleton_DCL();
            return INSTANCE;
        }
    }
}

問(wèn)題1:避免指令重排序,導(dǎo)致賦值語(yǔ)句先于構(gòu)造函數(shù)執(zhí)行,得到一個(gè)未初始化完畢的對(duì)象。

問(wèn)題2、3:Double Check Lock 機(jī)制。同步代碼塊外部的判斷語(yǔ)句主要用于 INSTANCE 初始化并賦值之后,此時(shí) INSTANCE != null,如果有多個(gè)線程嘗試獲取單例,可以提前返回,不用執(zhí)行同步代碼塊。而同步代碼塊內(nèi)部的判斷主要用于第一次初始化時(shí),INSTANCE = null,此時(shí)可以有多個(gè)線程嘗試獲取 INSTANCE,只能有一個(gè)線程進(jìn)入同步代碼塊,其他線程在同步代碼塊外阻塞,該線程創(chuàng)建一個(gè)單例對(duì)象之后,喚醒其他線程,再進(jìn)入同步代碼塊,發(fā)現(xiàn) INSTANCE != null,則直接返回,不用重新創(chuàng)建單例對(duì)象,提高了效率。

靜態(tài)內(nèi)部類(lèi)懶漢單例

public final class Singleton_LazyHolder {
    private Singleton_LazyHolder(){}

    // 問(wèn)題1:屬于懶漢式還是餓漢式
    private static class LazyHolder{
        static final Singleton_LazyHolder INSTANCE = new Singleton_LazyHolder();
    }

    // 問(wèn)題2:在創(chuàng)建時(shí)是否有并發(fā)問(wèn)題
    public static Singleton_LazyHolder getInstance() {
        return LazyHolder.INSTANCE;
    }
}

問(wèn)題1:懶漢式。靜態(tài)內(nèi)部類(lèi)只有在被方法調(diào)用的時(shí)候才進(jìn)行初始化,類(lèi)加載。

問(wèn)題2:無(wú),類(lèi)加載由 jvm 進(jìn)行,線程安全。

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

相關(guān)文章

  • javaweb中mysql數(shù)據(jù)庫(kù)連接步驟方法及其實(shí)例

    javaweb中mysql數(shù)據(jù)庫(kù)連接步驟方法及其實(shí)例

    這篇文章主要介紹了使用java web 連接MySQL數(shù)據(jù)庫(kù)的驅(qū)動(dòng)方法的相關(guān)知識(shí),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-04-04
  • maven deploy時(shí)報(bào)錯(cuò)的解決方法

    maven deploy時(shí)報(bào)錯(cuò)的解決方法

    這篇文章主要介紹了maven deploy時(shí)報(bào)錯(cuò)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 五種單件模式之Singleton的實(shí)現(xiàn)方法詳解

    五種單件模式之Singleton的實(shí)現(xiàn)方法詳解

    本篇文章是對(duì)Singleton的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 詳解Spring事件發(fā)布與監(jiān)聽(tīng)機(jī)制

    詳解Spring事件發(fā)布與監(jiān)聽(tīng)機(jī)制

    Spring提供了ApplicationContext事件機(jī)制,可以發(fā)布和監(jiān)聽(tīng)事件,這個(gè)特性非常有用。Spring內(nèi)置了一些事件和監(jiān)聽(tīng)器,例如在Spring容器啟動(dòng)前,Spring容器啟動(dòng)后,應(yīng)用啟動(dòng)失敗后等事件發(fā)生后,監(jiān)聽(tīng)在這些事件上的監(jiān)聽(tīng)器會(huì)做出相應(yīng)的響應(yīng)處理
    2021-06-06
  • Mybatis-Plus自動(dòng)生成的數(shù)據(jù)庫(kù)id過(guò)長(zhǎng)的解決

    Mybatis-Plus自動(dòng)生成的數(shù)據(jù)庫(kù)id過(guò)長(zhǎng)的解決

    這篇文章主要介紹了Mybatis-Plus自動(dòng)生成的數(shù)據(jù)庫(kù)id過(guò)長(zhǎng)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java基于IO流讀取文件的方法

    Java基于IO流讀取文件的方法

    這篇文章主要介紹了Java基于IO流讀取文件的方法,涉及Java文件流操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Java編程求二叉樹(shù)的鏡像兩種方法介紹

    Java編程求二叉樹(shù)的鏡像兩種方法介紹

    這篇文章主要介紹了Java編程求二叉樹(shù)的鏡像兩種方法介紹,分享了兩種方法,遞歸與非遞歸,每種方法又分別介紹了兩種解決思路,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Springboot項(xiàng)目?jī)?yōu)雅地處理日志的方法詳解

    Springboot項(xiàng)目?jī)?yōu)雅地處理日志的方法詳解

    這篇文章主要介紹了Springboot項(xiàng)目---優(yōu)雅地處理日志,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Java泛型詳解

    Java泛型詳解

    本文給大家匯總介紹了下java中的泛型的相關(guān)資料,包括引入泛型機(jī)制的原因,泛型類(lèi),泛型方法,泛型的實(shí)現(xiàn)以及泛型的注意事項(xiàng),非常的詳細(xì),有需要的小伙伴可以參考下
    2016-03-03
  • 詳談Java幾種線程池類(lèi)型介紹及使用方法

    詳談Java幾種線程池類(lèi)型介紹及使用方法

    下面小編就為大家?guī)?lái)一篇詳談Java幾種線程池類(lèi)型介紹及使用方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03

最新評(píng)論