【发布时间】:2014-09-01 16:40:57
【问题描述】:
我想确保我的 Singleton 实例安全可用且同步最少,但我对同步块之外的第一个 if 子句表示怀疑。 INSTANCE 在未完全构造时是否有可能具有非空值?如果是这样,我该如何解决这个问题。
我认为包含整个get() 块会降低效率,因为有太多的配置变量必须通过get() 方法从程序的不同部分每秒读取数千次。
public class ConfsDBLoader {
private static ConfsDBLoader INSTANCE = null;
private static final Object lock = new Object();
private ConfsDBLoader() { //Codes loading the db objects
}
public static ConfsDBLoader get(){
if(INSTANCE != null){
return INSTANCE;
} else {
synchronized(lock){
if(INSTANCE == null){
INSTANCE = new ConfsDBLoader();
}
return INSTANCE;
}
}
}
}
注意:我不能使用静态初始化,因为我的 hibernate sessionFactory 是静态初始化的,我希望拥有相互需要的复杂静态结构。事实上,我已经有了它,我不想让它变得越来越复杂,并调查这些静态属性在哪里尝试相互使用。
【问题讨论】:
-
我假设您知道一些更简单的替代方案已经存在了大约十年。您能否告诉我们您的考虑以及为什么它们不合适?
-
您正在使用一个非常古老且非常知名的反模式。它不是线程安全的。当第一个调用者仍在初始化它时,第二个调用者可以找到一个非空实例。
-
你的意思是我应该嵌套两个同步?但效率不高!
-
我建议你使用 SingletonHolder 或
enum,根本不使用同步。你能说说你为什么不使用这些吗? -
@Johnny:他们都不急于求成。您正在尝试“优化”一个根本不存在的问题。
标签: java multithreading synchronization singleton