【发布时间】:2016-08-02 07:21:10
【问题描述】:
看下面的代码,这让我很困惑,在类 DynamicPropertyFactory 中,它锁定了 ConfigurationManager.class,据我了解,锁只在类或实例本身中起作用。这个怎么理解?
public class *DynamicPropertyFactory*{
public static *DynamicPropertyFactory* initWithConfigurationSource(AbstractConfiguration config) {
synchronized (**ConfigurationManager.class**) {
if (config == null) {
throw new NullPointerException("config is null");
}
if (ConfigurationManager.isConfigurationInstalled() && config != ConfigurationManager.instance) {
throw new IllegalStateException("ConfigurationManager is already initialized with configuration "
+ ConfigurationManager.getConfigInstance());
}
if (config instanceof DynamicPropertySupport) {
return initWithConfigurationSource((DynamicPropertySupport) config);
}
return initWithConfigurationSource(new ConfigurationBackedDynamicPropertySupportImpl(config));
}
}
}
【问题讨论】:
-
为什么你首先锁定
class? -
“锁只在类或实例本身中起作用”不清楚你在这里的意思。
-
还要注意
synchronized不会“锁定”任何东西。它获取对象监视器上的排他锁(在本例中为ConfigurationManager.class),防止使用相同锁的多个同步方法或块同时运行。 -
您与 ConfigurationManager.class 对象同步。这并不意味着该类中的所有方法都这样做。仅当它们也使用 synchronized 关键字或获取类对象上的锁时。
-
一个类也是一个(单例)对象。可能是那个类有同步方法,上面的同步也想和它们同步。当然很丑。
标签: java concurrency java.util.concurrent concurrent-programming