溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java單例模式的線(xiàn)程安全實(shí)現(xiàn)

發(fā)布時(shí)間:2024-09-29 19:22:28 來(lái)源:億速云 閱讀:81 作者:小樊 欄目:編程語(yǔ)言

在Java中,單例模式是一種創(chuàng)建型設(shè)計(jì)模式,它確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn)。為了確保線(xiàn)程安全,我們可以使用以下幾種方法來(lái)實(shí)現(xiàn)單例模式:

  1. 懶漢式 + 雙重檢查鎖定(DCL)
public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
    }

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

這里使用了雙重檢查鎖定(DCL),首先檢查實(shí)例是否為null,如果為null,則進(jìn)入同步塊。在同步塊內(nèi)部再次檢查實(shí)例是否為null,如果仍然為null,則創(chuàng)建實(shí)例。使用volatile關(guān)鍵字確保多線(xiàn)程環(huán)境下的可見(jiàn)性。

  1. 餓漢式
public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}

餓漢式單例模式在類(lèi)加載時(shí)就創(chuàng)建實(shí)例,因此是線(xiàn)程安全的。但是,這種方式可能會(huì)浪費(fèi)資源,因?yàn)閷?shí)例在類(lèi)加載時(shí)就被創(chuàng)建,而不管是否真的需要使用它。

  1. 靜態(tài)內(nèi)部類(lèi)
public class Singleton {
    private Singleton() {
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

靜態(tài)內(nèi)部類(lèi)單例模式利用了Java類(lèi)加載機(jī)制,只有在調(diào)用getInstance()方法時(shí)才會(huì)加載SingletonHolder類(lèi)并創(chuàng)建實(shí)例。這種方式既保證了線(xiàn)程安全,又避免了資源浪費(fèi)。

  1. 枚舉
public enum Singleton {
    INSTANCE;

    // 其他方法
}

枚舉單例模式是線(xiàn)程安全的,因?yàn)镴ava枚舉類(lèi)型的實(shí)例在類(lèi)加載時(shí)就被創(chuàng)建,并且每個(gè)枚舉類(lèi)型都是單例。但是,枚舉類(lèi)型只能表示固定的幾個(gè)實(shí)例,不適合表示大量實(shí)例的場(chǎng)景。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI