【发布时间】:2013-11-19 17:25:14
【问题描述】:
JSE5 之前的:
以下两种在 Pre-JSE5 中实现单例设计模式的方式有什么区别?在我看来,两者都只是延迟加载。
即使是静态工厂方法也不是懒加载,还有什么区别?
双重检查锁定方法:
public class Singleton {
private static volatile Singleton sic;
private Singleton() {}
public static Singleton getInstance() {
if (sic == null) {
// Let's make it thread safe using 'synchronized'
synchronized(Singleton.class) {
if (sic == null) {
sic = new Singleton();
}
}
}
return sic;
}
}
静态工厂方法
public class Singleton_StaticFactory {
private static final Singleton_StaticFactory s = new Singleton_StaticFactory();
private Singleton_StaticFactory() {}
public static Singleton_StaticFactory getInstance() {
return s;
}
}
更新
Russell Zahniser 在他的回答中解释了为什么静态工厂实现会在“getInstance”方法之前访问其他静态方法(如果存在)时提前以不希望的方式加载单例。因此,与我上面所说的不同,两者在“延迟初始化”方面并不相同。
我仍然想知道是否还有其他差异。
【问题讨论】:
-
还在 java 1.4 上吗?换工作,除非他们给你很高的薪水......
-
en.wikipedia.org/wiki/Double-checked_locking 对此进行了广泛的讨论
-
@zhong.j.yu 这个问题的措辞让我觉得这是一个学术或工作面试问题,因为在java5之前有一个特定的区别。
标签: java oop design-patterns