Java 使用同步锁时感到困惑
请看下面的代码,这让我感到困惑,在类DynamicPropertyFactory中,它锁定ConfigurationManager.class,据我所知,锁定只在类或实例本身中起作用。如何理解这一点Java 使用同步锁时感到困惑,java,concurrency,java.util.concurrent,concurrent-programming,Java,Concurrency,Java.util.concurrent,Concurrent Programming,请看下面的代码,这让我感到困惑,在类DynamicPropertyFactory中,它锁定ConfigurationManager.class,据我所知,锁定只在类或实例本身中起作用。如何理解这一点 public class *DynamicPropertyFactory*{ public static *DynamicPropertyFactory* initWithConfigurationSource(AbstractConfiguration config) {
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));
}
}
}
据我所知,锁只在类或实例本身中起作用 这是错误的,不清楚你想说什么 可以对任何不指向
null
的引用进行锁定
synchronized (ConfigurationManager.class)
这一行表示在
类上执行对象锁定。在本例中,锁定在配置管理器上。类的工作方式类似于全局监视器
如果将相同的锁放入ConfigurationManager
实例,则
将同步所有线程,这些线程处理高度相关的ConfigurationManager
的每个实例;记住,synchronized(target)
的目标是管理代码块的互斥性的东西。根据目标的监视器是否被锁定,在任何给定时间只有一个线程可以执行代码块,但目标不一定总是同一个对象
代码中引用的ConfigurationManager.class
应解析为同一个对象,因此它应作为通用锁工作。但是,将类似于synchronized(this)
的东西与多个实例结合使用,将导致每个实例都有一个锁,并且该代码能够在这些实例之间并行运行,只是不能在任何单个实例上并行运行
锁定.class被认为是不好的做法,您应该选择类似于private static final Object lock=new Object()
相反,如果您确实必须拥有全局锁。为什么首先锁定类
?“锁只在类或实例本身中工作”不清楚您在这里的意思。还要注意,synchronized
不会“锁定”任何东西。它在对象的监视器上获取独占锁(在本例中为ConfigurationManager.class
),防止使用同一锁的多个同步方法或块同时运行。您可以针对ConfigurationManager.class对象进行同步。这并不意味着该类中的所有方法都这样做。仅当它们也使用synchronized关键字或获取类对象的锁时。类也是(单例)对象。可能是该类有同步的方法,上面的同步也希望与它们同步。当然很难看。对不起,我的英语很差。我不明白为什么DynamicPropertyFactory类使用与另一个类同步的方法,大多数情况下,我编写的代码类似于公共类DynamicPropertyFactory*{public static*DynamicPropertyFactory initWithConfigurationSource(AbstractConfiguration config){synchronized(this){}}但这与类DynamicPropertyFactory有什么关系,它不能与DynamicPropertyFactory类或其InstanceMagine上的线程同步,ConfigurationManager.class是静态/常量/全局监视器,以防止其块上出现任何异步性能。不幸的是,我的英语技能也很差。我无法用其他方式解释)如果你在阅读文章时理解了一些东西,应该多读几遍。谢谢。