[英]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.