如果您的Java Singleton看起来像这样:
public class MySingleton {
private static MySingleton instance;
private int member;
public static MySingleton getInstance(){
if(instance==null){
instance = new MySingleton();
}
return instance;
}
private MySingleton(){
//empty private constructor
}
public int getMemberA(){
return member;
}
public int getMemberB(){
return instance.member;
}
}
... getMemberA和getMemberB之间有区别吗?也就是说,使用instance.xxx
和xxx
访问该成员之间是否存在差异?
注意:我知道使用Singleton模式的优点和缺点!
答案 0 :(得分:10)
是的,有区别。
您的单例实现目前不是线程安全的,这意味着可以在getMemberB()
上的{{1>}上调用instance
而不是 {{1}}引用的实例。会得到不同的结果。
如果你的实现是线程安全的(所以真的只能创建一个实例)那么它们就是等价的,而更简单的形式会更受欢迎。
答案 1 :(得分:4)
没有功能差异,但我发现getMemberA()
更容易看到。
请注意,您的单例不是线程安全的。同时调用getInstance()
的两个线程可能导致创建两个对象。如果发生这种情况,单身合同就会被打破,所有的赌注都会被取消。
答案 2 :(得分:1)
行为没有区别,但是,我宁愿使用'return member'甚至'return this.member',因为这看起来更直观。
线程安全是一个完全不同的主题,这个简单的单例不符合任何线程安全的单例要求。
答案 3 :(得分:0)
您对Singleton模式的实现使用延迟加载技术。但它不是线程安全的。我们可以使用synchronized
关键字使getInstance()
方法线程安全,但会损害性能。我们对私人单身成员进行仔细检查会更好。
public class MySingleton {
private volatile static MySingleton instance;
public static MySingleton getInstance(){
if (instance == null) {
synchronized (MySingleton.class) {
if (instance == null) {
instance = new MySingleton();
}
}
}
return instance;
}
private MySingleton(){
//empty private constructor
}
}