【发布时间】:2018-11-19 03:33:25
【问题描述】:
为什么 Bill Pugh 的 Singleton 设计模式线程是安全的?
public class Logger {
private Logger() {
// private constructor
}
// static inner class - inner classes are not loaded until they are
// referenced.
private static class LoggerHolder {
private static Logger logger = new Logger();
}
// global access point
public static Logger getInstance() {
return LoggerHolder.logger;
}
//Other methods
}
【问题讨论】:
-
您的答案在 cmets 本身内
-
因为加载和初始化类的语义被定义为只执行一次并且静态最终字段被安全发布。
-
Brian Goetz 最好地解释了这一点。你应该阅读他的书Java Concurrency in Practice 以获得完整的解释。对于精简版,请参阅这个 SO 问题:stackoverflow.com/questions/801993/…(但基本上,
static关键字在 Java 中是特殊的,并且由于 Java 类的加载方式和已初始化。) -
@AndyTurner
final和static都可以。它是一个或另一个,它不需要是final。没有仔细检查,但我确定这是在 Brian Goetz 的书中。请再检查一遍!
标签: java multithreading singleton