使用同步锁时感到困惑



请参阅下面的代码,这让我很困惑,在类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();之类的东西。

相关内容

  • 没有找到相关文章

最新更新