请参阅下面的代码,这让我很困惑,在类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));
}
}
}
据我所知,锁只在类或实例本身中起作用
这是错误的,不清楚你想说什么。
可以对不指向CCD_ 1的任何引用取锁。
synchronized (ConfigurationManager.class)
这一行表示在CCD_ 2上正在获取对象锁定。
在这种情况下,对ConfigurationManager.class
的锁定就像全局监视器一样工作。
如果将相同的锁放入ConfigurationManager
实例,则将同步处理ConfigurationManager
的每个实例的所有线程。
这个问题非常相关;请记住,synchronized(target)
的目标是管理代码块的互斥性。根据目标的监视器是否被锁定,在任何给定时间只有一个线程可以执行代码块,但目标不一定总是同一个对象。
在代码中引用ConfigurationManager.class
的任何地方都应该解析为同一个对象,因此它应该作为通用锁工作。然而,将类似synchronized(this)
的代码与多个实例结合使用会导致每个实例都有一个锁,并且该代码能够在这些实例之间并行运行,而不是在任何单个实例上并行运行。
锁定.class被认为是不好的做法,如果您真的必须有全局锁,那么您应该选择private static final Object lock = new Object();
之类的东西。