java - 线程安全单例和内部类解决方案

标签 java thread-safety singleton

这就是我总是创建线程安全单例的方式,以便在多线程应用程序中使用它。

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 的类,该类的许多可用实现(包括一个内置函数)已经存在足够的困惑。

关于java - 线程安全单例和内部类解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16501953/

相关文章:

java - 在 JUnit (4.8.1) 测试套件中分配 static final int

java - 有什么办法可以找到循环引用吗?

java - JPA 避免多重子查询

java - Struts 2 操作线程安全吗?

c# - 检查 null 线程安全吗?

c++ - DLL 中的单例?

java - 如何区分推断公理和显式公理?

iOS swift : EXC_BAD_ACCESS(code=EXC_i386_GPFLT ) regarding a singleton

design-patterns - 单例还是对象缓存?

python - 线程本地是否意味着线程安全?