我想确保我的Singleton实例可以安全地使用并且同步最少,但是我对第一个if子句在synchronized块之外有疑问。如果INSTANCE
没有完全构建,它有可能具有非空值吗?如果是的话,我该如何解决这个问题。以下Singleton可以在多线程环境中不安全
我认为包括整个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;
}
}
}
}
注:我不能使用静态初始化,因为我的SessionFactory的静态初始化,我想有一个互相需要复杂的静态结构。事实上,我已经拥有它了,我不想让它变得越来越复杂,并且调查这些静态属性尝试彼此使用的位置。
我假设你知道有哪些已经出现了更简单的方法大约十年。你能让我们知道你在考虑什么,为什么他们不合适? – 2014-09-01 16:46:09
您正在使用一种非常古老且非常出名的反模式。它不是线程安全的。第二个调用者可以在第一个调用者仍在初始化INSTANCE时找到非空的INSTANCE。 – gnasher729 2014-09-01 16:47:30
你是说我应该嵌套两个同步?但它效率不高! – Johnny 2014-09-01 16:48:30