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