关于Singletons的维基百科文章提到了几种线程安全的方式来实现Java中的结构。对于我的问题,让我们考虑具有冗长的初始化过程并且一次被许多线程共享的单例。Java中的线程安全Singletons
首先,这是未提及的方法线程安全的,如果是的话,它在什么同步?
public class Singleton {
private Singleton instance;
private Singleton() {
//lots of initialization code
}
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
其次,为什么下面的实现线程安全和懒惰的初始化?如果两个线程同时输入getInstance()
方法,会发生什么情况?
public class Singleton {
private Singleton() {
//lots of initialization code
}
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
最后,在第二个例子,如果一个线程首先获得一个实例,而另一个线程获取一个实例,并试图构造函数中的第一个线程完成之前执行它的动作?那么你会进入一个不安全的状态吗?
阅读完这篇文章后,我是否正确地说Java在加载静态字段时会进行一些“内部”同步? – donnyton
_“这种模式是用于单例模式。”_ - 以及[有效的Java的枚举单例](http://stackoverflow.com/questions/427902/java-enum-singleton)? –
枚举单例的恕我直言不像这个那样干净明显,因此也不是那么好:'MyClass.getInstance()'是单身人士的行业标准 - 每个人自动使用它(应该)知道他们正在处理一个单身。这种模式有正确的API *和*引擎盖下的正确实施。 – Bohemian