使用AtomicReference的带参数的Singleton

时间:2017-05-12 21:27:44

标签: java multithreading singleton atomicreference

我必须创建一个接受输入参数的Singleton。基本上我需要根据某些配置在库中创建一个DBConnector。现在,这个配置由消费应用程序传递给库。根据传入的配置,我想创建一个DBConnector实例,然后在库中重用它。 我想过使用DI来处理这个问题,但是当初始化这个库时,我不知道实际上是否需要数据库连接,如果不需要,我不想创建这个DBConnector。 初始化库后,在getResponse(RequestType rt)调用上,我是否知道是否需要DBConnector(基于RequestType),那时我需要创建实例。 因此,下面的代码对于multiThreaded环境看起来不错?

sumup

}

修改 写了一个多线程测试,所有线程都得到了相同的实例。但是,只是想确保我不会因为Java内存模型而错过任何边缘情况

1 个答案:

答案 0 :(得分:0)

按原样,它看起来对我来说听起来很合理。

我觉得有趣的一件事是你使用单例模式,如果你输掉一场比赛并使用第二个DBConnector,可能会抛弃AtomicReference#get()的一个实例。单个实例的完整点不是确保只创建一个 的实例吗?如果这是你的意图,那么你使用的模式不适合这个。你必须同步。

否则,如果您坚持使用无锁初始化并且可能有多个实例化,那么您应该只使用一个AtomicReference,如下所示:

private static AtomicReference<DBConnector> instance = new AtomicReference<>();

public static DBConnector getDBConnector(DBConfig dBConfig) {
    // First try
    DBConnector con = instance.get();
    if (con == null) {
        con = // ...

        if (instance.compareAndSet(null, con)) {
            // Successful swap, return our copy
            return con;
        } else {
            // Lost the race, poll again
            return instance.get():
        }
    }

    // Already present value
    return con;
}