2

아래 코드를 참조하십시오. 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)); 
      } 
     } 
    } 
+0

왜 처음에'class'를 잠그고 있습니까? – emotionlessbananas

+2

"잠금은 클래스 또는 인스턴스 자체에서만 작동합니다."여기서 의미하는 것이 명확하지 않습니다. –

+0

또한 'synchronized'는 아무 것도 "잠그지"않습니다. 오브젝트의 모니터 (이 경우는'ConfigurationManager.class')에 배타 락을 취득 해, 같은 동기 락을 사용하는 복수의 동기 메소드 또는 블록이 동시에 실행하는 것을 방지합니다. – Kayaman

답변

1

이 잠금은 클래스 또는 인스턴스 자체

이 잘못하고 싶은 말 불분명 작동합니다.

null을 가리 키지 않는 참조에서 잠금을 설정할 수 있습니다.

synchronized (ConfigurationManager.class) 

이 줄은 class 개체 잠금이 수행되고 있음을 의미합니다.

+0

불쌍한 영어에 대한 죄송합니다. 나는 DynamicPropertyFactory 클래스가 다른 클래스와 동기화 된 이유를 이해하지 못한다. public class DynamicPropertyFactory * public static DynamicPropertyFactory * initWithConfigurationSource (AbstractConfiguration config) { – lawrence

0

이 경우 ConfigurationManager.class의 잠금 장치는 글로벌 모니터와 동일하게 작동합니다. 당신이 ConfigurationManager예를에 동일한 잠금을 넣으면

그것은 ConfigurationManager의 각 인스턴스를 다루는 모든 스레드를 동기화합니다.

+0

DynamicPropertyFactory 클래스를 사용하여 DynamicPropertyFactory 클래스 또는 해당 인스턴스의 스레드와 동기화 할 수 없습니다. – lawrence

+0

해당 ConfigurationManager를 상상해보십시오.클래스는 해당 블록에서 비동기 성능을 방지하기 위해 정적/상수/전역 모니터입니다. 불행히도 영어 실력도 떨어집니다. 그리고 나는 다른 방법으로 설명 할 수 없다.) –

0

This question은 매우 관련성이 있습니다. synchronized(target)의 대상이 코드 블록의 상호 배타성을 관리하는 것임을 기억하십시오. 대상의 모니터가 잠겨 있는지 여부에 따라 한 번에 하나의 스레드 만 코드 블록을 실행할 수 있지만 대상은 항상 동일한 개체가 아닐 수 있습니다.

코드에서 ConfigurationManager.class을 참조하는 모든 곳에서 동일한 개체가 해결되어야하므로 범용 잠금 장치로 작동해야합니다. 그러나 많은 인스턴스와 결합 된 synchronized(this)과 같은 것을 사용하면 인스턴스 당 잠금이 생기고 해당 인스턴스에서 해당 코드가 병렬로 실행될 수있는 기능이 생기고 단일 인스턴스에서 병렬로 실행되지 않습니다.

.class를 잠그는 것은 나쁜 습관으로 간주되며 실제로 글로벌 잠금이 필요한 경우 private static final Object lock = new Object();과 같은 것을 선택해야합니다.

+0

글을 읽을 때 뭔가를 이해하고있는 것으로 보이지만 더 많은 시간을 읽어야한다. 감사. – lawrence