我经常看到以这种方式构建的单身人士:
public static MyClass instance() {
if (singleton == null) {
singleton = new MyClass();
}
return singleton;
}
如果不是懒惰的初始化效果,那么该方法是否比简单地声明像这样的静态实例有任何优势?
public final static MyClass singleton = new MyClass();
答案 0 :(得分:0)
不,实际上是另一种方法,即:
public final static MyClass singleton = new MyClass();
可能会更好,因为如果你有2个线程同时调用实例方法,你可能会遇到竞争条件。
这就是Java in Practice所说的做单身人士的方式:
private final static MyClass _instance = new MyClass();
public static MyClass getInstance() {
return _instance;
}
private MyClass() {}
更新自@ jon-skeet提到它以来,Joshua Block在“Effective Java”一书中对单身人士进行了很好的讨论。他指出的一件事是,如果你想让你的Singleton可序列化,你不能只实现Serializable。您还需要覆盖readResolve方法。使用上述方法可以轻松实现:
private Object readResolve() throws ObjectStreamException {
return _instance;
}
更新2 :查看关于@mardavi链接的单身人士的精彩讨论:http://en.wikipedia.org/wiki/Singleton_pattern#Initialization_On_Demand_Holder_Idiom