簡體   English   中英

線程安全單例和內部類解決方案

[英]Thread safe singleton and inner class solution

這就是我始終創建線程安全單例的方式,以便在多線程應用程序中使用它。

public class Logger {

    private Logger() {}

    private static Logger instance = new Logger();

    public static Logger getInstance() {
        return instance;
    }

    public void log(String s) {
        // Log here
    }
}

今天,我正在學習獲得Java認證,並且在書上找到了另一個解決方案:

public class Logger {

    private Logger() {}

    private static Logger instance;

    private static class LoggerHolder {
        public static Logger logger = new Logger();
    }

    public static Logger getInstance() {
        return LoggerHolder.logger;
    }

    public void log(String s) {
        // Log here
    }
}

他們沒有提到另一個。

有什么更好的? 兩種解決方案之間有什么區別?

第二個示例不太可能僅僅因為您訪問了類而創建了實例。 相反,您將必須訪問內部類。 對於JDK庫設計人員而言,這種偏執感是有意義的,但是在受更多控制的代碼庫中,它是最重要的恕我直言。

我更喜歡簡單,會用它代替

public enum MyLogger {
    INSTANCE;

    public void log(String s) {
       // log here
    }
}

我強烈建議不要創建一個稱為Logger類。對於此類的許多實現,包括一個內置的實現,已經有足夠的困惑。

第二個是懶惰的。 如果程序奇跡getInstance()加載了該類但從未調用過getInstance() ,則將不會創建可能是創建昂貴對象的記錄器實例。

坦白說,如果確實需要單例(並且使用依賴注入框架,幾乎總是不需要它們),我更喜歡第一種解決方案,它更易於理解。 我很少(如果曾經見過)看到一個加載了類但從未在實際代碼中使用過的單例。

暫無
暫無

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

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