2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁常見問題正文

用Java寫一個線程安全的單例模式(Singleton)?

更新時間:2023-09-12 來源:黑馬程序員 瀏覽量:

IT培訓班

  要編寫一個線程安全的單例模式(Singleton)類,我們可以使用以下方法之一。這兩種方法都確保只有一個實例被創建,并且在多線程環境中安全使用。

  方法一:懶漢式(Lazy Initialization)

  在懶漢式中,實例在第一次被請求時才會被創建。

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有構造函數,防止外部實例化
    }

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

  這種方法使用了synchronized關鍵字來確保線程安全,但它會引入性能開銷,因為每次調用getInstance方法都會進行同步。
1694482375300_線程安全的單例模式.jpg

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

  雙重檢查鎖定允許我們在沒有同步的情況下創建實例,只有在實例不存在時才進行同步。

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;
    }
}

  在這個版本中,我們使用了volatile關鍵字來確保instance變量對所有線程可見,避免了可能的重排序問題。

  使用上述任何一種方法都可以創建一個線程安全的單例模式類。如果我們使用Java 5或更高版本,強烈建議使用雙重檢查鎖定方法,因為它在性能上有一些優勢。但要注意,這些示例中的單例模式是懶加載的,只有在需要時才會創建實例。如果我們需要在應用程序啟動時立即創建實例,可以使用餓漢式(Eager Initialization)方法。

分享到:
在線咨詢 我要報名
和我們在線交談!