当使用静态初始化实现线程安全单例时,Initialize-On-Demand 习惯是否真的有必要,或者实例的简单静态声明就足够了?
将实例简单声明为静态字段:
class Singleton
{
private static Singleton instance=new Singleton();
private Singleton () {..}
public static Singleton getInstance()
{
return instance;
}
}
vs
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/
后一种方法是否提供了前一种方法所没有的任何好处?
好吧,我能说的是这些文章是 7-9 岁的。
现在我们有了 > Java 1.5,我们拥有了枚举的能力enum
。根据“Josh Block”,编写单例的最佳方法是编写单元素枚举
public enum MySingleton{
Singleton;
// rest of the implementation.
// ....
}
但对于你的问题,我想使用这两种实现都没有问题。我个人更喜欢第一个选项,因为它简单易懂。
但要注意漏洞,通过序列化和反序列化对象或克隆对象,我们可以在同一个 JVM 中同时创建更多此类对象。
还要使类成为最终类,因为我们可以通过扩展类来违反单例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)