Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用同步锁时感到困惑_Java_Concurrency_Java.util.concurrent_Concurrent Programming - Fatal编程技术网

Java 使用同步锁时感到困惑

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) {

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

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

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

可以对任何不指向
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是静态/常量/全局监视器,以防止其块上出现任何异步性能。不幸的是,我的英语技能也很差。我无法用其他方式解释)如果你在阅读文章时理解了一些东西,应该多读几遍。谢谢。