混淆了同步使用

时间:2016-12-19 03:21:59

标签: java multithreading synchronization locking synchronized

我看到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在其当前类中使用。那么,有人可以帮忙解释一下吗?

2 个答案:

答案 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