全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)常見(jiàn)問(wèn)題正文

用Java寫(xiě)一個(gè)線(xiàn)程安全的單例模式(Singleton)?

更新時(shí)間:2023-09-12 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  要編寫(xiě)一個(gè)線(xiàn)程安全的單例模式(Singleton)類(lèi),我們可以使用以下方法之一。這兩種方法都確保只有一個(gè)實(shí)例被創(chuàng)建,并且在多線(xiàn)程環(huán)境中安全使用。

  方法一:懶漢式(Lazy Initialization)

  在懶漢式中,實(shí)例在第一次被請(qǐng)求時(shí)才會(huì)被創(chuàng)建。

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有構(gòu)造函數(shù),防止外部實(shí)例化
    }

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

  這種方法使用了synchronized關(guān)鍵字來(lái)確保線(xiàn)程安全,但它會(huì)引入性能開(kāi)銷(xiāo),因?yàn)槊看握{(diào)用getInstance方法都會(huì)進(jìn)行同步。
1694482375300_線(xiàn)程安全的單例模式.jpg

  方法二:雙重檢查鎖定(Double-Checked Locking)

  雙重檢查鎖定允許我們?cè)跊](méi)有同步的情況下創(chuàng)建實(shí)例,只有在實(shí)例不存在時(shí)才進(jìn)行同步。

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
        // 私有構(gòu)造函數(shù),防止外部實(shí)例化
    }

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

  在這個(gè)版本中,我們使用了volatile關(guān)鍵字來(lái)確保instance變量對(duì)所有線(xiàn)程可見(jiàn),避免了可能的重排序問(wèn)題。

  使用上述任何一種方法都可以創(chuàng)建一個(gè)線(xiàn)程安全的單例模式類(lèi)。如果我們使用Java 5或更高版本,強(qiáng)烈建議使用雙重檢查鎖定方法,因?yàn)樗谛阅苌嫌幸恍﹥?yōu)勢(shì)。但要注意,這些示例中的單例模式是懶加載的,只有在需要時(shí)才會(huì)創(chuàng)建實(shí)例。如果我們需要在應(yīng)用程序啟動(dòng)時(shí)立即創(chuàng)建實(shí)例,可以使用餓漢式(Eager Initialization)方法。

分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!