【发布时间】:2011-07-07 06:31:41
【问题描述】:
这里的一个最近的问题有以下代码(嗯,类似于这个)来实现一个没有同步的单例。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
现在,我想明白这是在做什么了。由于实例是static final,它早在任何线程调用getInstance() 之前就已构建,因此实际上不需要同步。
仅当两个线程尝试同时调用getInstance() 时才需要同步(并且该方法在第一次调用而不是在"static final" 时间进行构造)。
因此,我的问题基本上是:那你为什么更喜欢懒惰地构造单例:
public class Singleton {
private Singleton() {}
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
我唯一的想法是使用 static final 方法可能会引入排序问题,就像 C++ 静态初始化顺序惨败一样。
首先,Java真的有这个问题吗?我知道一个类的顺序 within 是完全指定的,但它是否能以某种方式保证类之间的顺序一致(例如使用类加载器)?
其次,如果顺序 是一致的,为什么惰性构造选项会有优势?
【问题讨论】:
标签: java singleton static-order-fiasco