让Singleton在其静态构造函数中接受参数是一个好主意吗?我可以有并发问题吗?
public class DataHelper {
private static DataHelper singleton = null;
private Listener<Object> listener;
public static DataHelper getInstance(Listener<Object> listener) {
if(singleton == null) {
singleton = new DataHelper();
}
singleton.listener = listener;
return singleton;
}
}
答案 0 :(得分:1)
虽然它可能并不坏(取决于您的需求),但这绝对不是一个好主意。既然你在调用getInstance()时已经有了一个'listener'对象,为什么不将它作为参数传递给singleton的成员函数呢?你的函数有两个竞争条件,一个是创建Singleton,另一个是设置'listener'成员变量。第二个可以通过不传递参数来避免。即使在单线程环境中,也存在问题
void foo() {
DataHelper dh = DataHelper.getInstance(listener1);
bar();
// dh.listener no longer points to listener1
}
void bar() {
DataHelper dh = DataHelper.getInstance(listener2);
}
如果有帮助,你应该阅读有关依赖注入的信息。
答案 1 :(得分:0)
向Singleton添加参数不会引入竞争条件(除非您传递对共享对象的引用)。但是,这种实现已经具有竞争条件。什么可以防止两个线程同时调用该方法?单身人士没有受到保护。