仅限 Java 5 及更高版本。假设一台多处理器共享内存计算机(您现在可能正在使用一台)。
以下是单例延迟初始化的代码:
public final class MySingleton {
private static MySingleton instance = null;
private MySingleton() { }
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
if (instance == null) {
instance = new MySingleton();
}
}
}
return instance;
}
}
instance
必须声明以防止优化器重写getInstance volatile
() 如下(这在顺序程序中是正确的):
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
// instance must be null or we wouldn't be here (WRONG!)
instance = new MySingleton();
}
}
}
假设优化器不重写代码,如果instance
没有声明volatile
,是否仍然保证在退出块时刷新到内存synchronized
,并在进入块时从内存中读取synchronized
?
编辑:我忘了让 getInstance() 静态。我认为这不会改变答案的有效性;你们都知道我的意思。