【问题标题】:puzzled when using synchronized lock [closed]使用同步锁时感到困惑[关闭]
【发布时间】:2016-08-02 07:21:10
【问题描述】:

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

【问题讨论】:

  • 为什么你首先锁定class
  • “锁只在类或实例本身中起作用”不清楚你在这里的意思。
  • 还要注意synchronized 不会“锁定”任何东西。它获取对象监视器上的排他锁(在本例中为ConfigurationManager.class),防止使用相同锁的多个同步方法或块同时运行。
  • 您与 ConfigurationManager.class 对象同步。这并不意味着该类中的所有方法都这样做。仅当它们也使用 synchronized 关键字或获取类对象上的锁时。
  • 一个类也是一个(单例)对象。可能是那个类有同步方法,上面的同步也想和它们同步。当然很丑。

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


【解决方案1】:

据我了解,锁只在类或实例本身中起作用

这是错误的,不清楚你想说什么。

可以对任何不指向null的引用进行锁定。

synchronized (ConfigurationManager.class)

这一行表示class 上的对象锁定正在被占用。

【讨论】:

  • 对不起我的英语不好。我不明白为什么 DynamicPropertyFactory 类使用与另一个类同步,大多数情况下,我编写的代码类似于 public class DynamicPropertyFactory*{public static *DynamicPropertyFactory initWithConfigurationSource(AbstractConfiguration config) { synchronized (this) {}}跨度>
【解决方案2】:

在这种情况下,锁定ConfigurationManager.class 就像全局监视器一样工作。

如果你把相同的锁放在ConfigurationManager instance 那么它 将同步处理ConfigurationManager 的每个实例的所有线程。

【讨论】:

  • 但这与DynamicPropertyFactory类有什么关系,它无法与DynamicPropertyFactory类或其实例上的线程同步
  • 想象一下 ConfigurationManager.class 是静态/常量/全局监视器,以防止其块上的任何异步性能。不幸的是我的英语水平也很差。我无法用另一种方式解释)
【解决方案3】:

This question 高度相关;请记住,synchronized(target) 的目标是管理代码块的互斥性。在任何给定时间,只有一个线程可以执行代码块,具体取决于目标的监视器是否被锁定,但目标不一定总是同一个对象。

您在代码中引用ConfigurationManager.class 的任何地方都应该解析为同一个对象,因此它应该用作通用锁。但是,将synchronized(this) 之类的东西与许多实例结合使用会导致每个实例都有一个锁,并且该代码可以在这些实例中并行运行,而不会在任何单个实例上并行运行。

锁定 .class 被认为是不好的做法,如果您确实必须拥有全局锁定,则应该选择 private static final Object lock = new Object(); 之类的东西。

【讨论】:

  • 阅读您的帖子时似乎理解了一些东西,应该阅读更多次。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2012-05-03
  • 1970-01-01
相关资源
最近更新 更多