1

拥有一个在其静态构造函数中接受参数的单例是个好主意吗?我可以有并发问题吗?

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;
    }
}
4

2 回答 2

1

虽然它可能还不错(取决于您的需求),但这绝对不是一个好主意。既然在调用 getInstance() 时已经有了一个“监听器”对象,为什么不将它作为参数传递给单例的成员函数呢?您的函数中有两个竞争条件,一个是在创建单例时,另一个是在设置“侦听器”成员变量时。第二个可以通过根本不传递参数来避免。即使在单线程环境中,你也有问题

void foo() {
  DataHelper dh = DataHelper.getInstance(listener1);
  bar();
  // dh.listener no longer points to listener1
}

void bar() {
  DataHelper dh = DataHelper.getInstance(listener2);
}

如果有帮助,您还应该阅读有关依赖注入的内容。

于 2013-09-15T19:58:48.040 回答
0

向 Singleton 添加参数不会引入竞争条件(除非您传递对共享对象的引用)。然而,这个实现已经有一个竞争条件。什么可以防止两个线程同时调用该方法?单例是不受保护的。

于 2013-09-15T19:43:09.063 回答