- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我必须创建一个接受输入参数的单例。基本上我需要根据某些配置在库中创建一个 DBConnector 。现在,此配置由使用应用程序传递到库。根据传入的配置,我想创建一个 DBConnector 实例,然后在库中重用该实例。我想过使用 DI 来处理这个问题,但是当这个库初始化时,我不知道是否确实需要 DB 连接,如果不需要,我不想创建这个 DBConnector。库初始化后,在 getResponse(RequestType rt) 调用中,我会知道是否需要 DBConnector(基于 RequestType),这就是我需要创建实例的时候。因此,下面的代码对于多线程环境看起来不错?
public class DBConnectorFactory
{
private static volatile DBConnector dBConnector = null;
private static AtomicReference<DBConnector> atomicReference = new AtomicReference<>();
private DBConnectorFactory()
{}
public static DBConnector getDBConnector(DBConfig dBConfig)
{
if(dBConnector == null)
{
if(atomicReference.compareAndSet(null,new DBConnector(dBConfig)))
dBConnector = atomicReference.get();
return atomicReference.get();
}
else
return dBConnector;
}
}
编辑编写了一个多线程测试,所有线程都获得相同的实例。然而只是想确保我不会因为 Java 内存模型而错过任何边缘情况
最佳答案
就我而言,它看起来在逻辑上是合理的。
我发现有趣的一件事是您使用单例模式,如果您输掉了一场比赛并诉诸于使用第二个 AtomicReference#get()
,该模式可能会丢弃 DBConnector
实例。单例的全部意义不就是确保只创建一个实例吗?如果这是您的意图,那么您使用的模式不适合此目的。您必须同步。
否则,如果您坚持使用无锁初始化并且可能有多个实例化,那么您应该只使用单个 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;
}
关于java - 使用 AtomicReference 带有参数的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43946729/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!