这就是我总是创建线程安全单例的方式,以便在多线程应用程序中使用它。
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/