我看到netflix代码,在DynamicPropertyFactory类中,有一个像
这样的方法public static DynamicPropertyFactory getInstance() {
if (config == null) {
synchronized (ConfigurationManager.class) {
if (config == null) {
AbstractConfiguration configFromManager = ConfigurationManager.getConfigInstance();
if (configFromManager != null) {
initWithConfigurationSource(configFromManager);
initializedWithDefaultConfig = !ConfigurationManager.isConfigurationInstalled();
logger.info("DynamicPropertyFactory is initialized with configuration sources: " + configFromManager);
}
}
}
}
return instance;
}
我对这种方法很困惑,为什么使用synchronized (ConfigurationManager.class)
,关键字synchronized用于另一个类ConfigurationManager.class
。从我的角度来看,synchronized在其当前类中使用。那么,有人可以帮忙解释一下吗?
答案 0 :(得分:0)
可能是因为他们希望其他类在其他一些线程上访问ConfigurationManager。
答案 1 :(得分:0)
上面的代码编写得不好。
DynamicPropertyFactory
不应该担心将synchronized
检查合并到ConfigurationManager
实例中。
理想情况下,ConfigurationManager.getConfigInstance()
应进行适当的检查,synchronized (ConfigurationManager.class)
检查应移至ConfigurationManager
。
ConfigurationManager
的来电者应该只使用getConfigInstance()
API获取实例而不进行任何synchronized
检查。
看看下面的SE问题以正确的方式实现Singleton对象:
Why is volatile used in this example of double checked locking