在使用静态初始化实现线程安全的单例时,Initialize-On-Demand 习语真的有必要吗,还是一个简单的实例静态声明就足够了?
将实例简单声明为静态字段:
class Singleton
{
private static Singleton instance=new Singleton();
private Singleton () {..}
public static Singleton getInstance()
{
return instance;
}
}
对比
class Singleton {
static class SingletonHolder {
static final Singleton INSTANCE = new Singleton();
}
private Singleton () {..}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
我问这个是因为 Brian Goetz 在本文中推荐了第一种方法:
http://www.ibm.com/developerworks/java/library/j-dcl/index.html
而他在本文中建议后者
http://www.ibm.com/developerworks/library/j-jtp03304/
后一种方法是否提供了前一种方法没有的任何好处?