参见下面的代码,这让我感到困惑,在类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));
}
}
}
答案 0 :(得分:1)
根据我的理解,锁仅在类或实例本身中起作用
这是错误的,不清楚你想说什么。
可以对未指向responseMessage = {StatusCode: 404, ReasonPhrase: 'Not Found', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
Pragma: no-cache
X-SourceFiles: =?UTF-8?B?RjpcU0FUXFNBVC5BUElcYXBpXEVtcGxveWVlXFVwZGF0ZVRvbGVyYW5jZVJhbmdlQnlFbXBsb3llZUlk?=
Cache-Contro...
的任何引用执行锁定。
null
此行表示正在synchronized (ConfigurationManager.class)
对象锁定。
答案 1 :(得分:0)
在这种情况下,ConfigurationManager.class
上的锁定就像全局监视器一样。
如果您将相同的锁定放入ConfigurationManager
实例,那么它
将同步所有处理ConfigurationManager
的每个实例的线程。
答案 2 :(得分:0)
This question具有高度相关性;请记住,synchronized(target)
的目标是管理代码块的互斥性的东西。根据目标的监视器是否被锁定,但目标不一定总是相同的对象,在任何给定时间只有一个线程可以执行代码块。
您在代码中引用ConfigurationManager.class
的任何地方都应该解析为同一个对象,因此它应该作为通用锁。但是,使用synchronized(this)
之类的内容与许多实例相结合会导致每个实例锁定,并且这些代码可以跨这些实例并行运行,而不是在任何单个实例上并行运行。
锁定.class被认为是不好的做法,如果你真的必须拥有全局锁定,你应该选择类似private static final Object lock = new Object();
的东西。