簡體   English   中英

何時使用正確版本的單例線程安全實現?

[英]When to use proper version of singleton thread-safe implementation?

我有一個像無狀態助手之類的課程,我想作為一個單例。 此類將在不同的線程之間共享。

我是否正確,在這種情況下(實例不需要巨大的內存分配大小,因此可以加載多次而不會影響資源和性能),因此無需使用適當的多線程惰性初始化策略來實現這種單例(雙重檢查鎖定)和易變,按需持有人習慣用法,Enum Singleton,同步訪問器)?

用簡單的非多線程惰性初始化版本策略(如下面的代碼)來實現這樣的單例,以減少樣板代碼量是否正確?

public class Singleton {
    private static Singleton INSTANCE;

    private Singleton() {
    }

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

並且僅在單例類的狀態在不同線程之間共享的情況下,才需要添加適當的單例初始化的多線程版本嗎?

如果您的類完全是無狀態的,請使其成為僅具有靜態函數的util類。

如果您有狀態並且想要一個半單身,我會說您所做的事情具有誤導性,因為讀者無法知道您是否知道可以獲取多個實例這一事實。 如果您決定堅持使用已發布的代碼-請將其重命名為多點或仔細記錄行為。 但是,不要這樣做只是為了減少樣板-實際上,給讀者造成的問題比要消除的問題還多。

在我看來,“按需持有人初始化”這一成語是最好的單例模式。 但我通常會建議您反對Singletons。 您最好在啟動線程時將對共享實例的引用傳遞給線程。

要回答您的問題...不,這是不正確的。

您說可以多次加載是可以的,但在這種情況下,它不是單例。 單例的定義特征是只能有一個實例。

如果可以有多個,那為什么要使它一個單身呢?

如果這只是無狀態的util方法,那為什么不僅僅使它靜態呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM