使用同步锁时很困惑

时间:2016-08-02 07:21:10

标签: java concurrency java.util.concurrent concurrent-programming

参见下面的代码,这让我感到困惑,在类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));
            }
        }
    }

3 个答案:

答案 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();的东西。