2014-12-08 3 views

답변

1

DecibelSample이 클래스라고 가정하면이 코드는 유효한 Java 코드가 아닙니다.

은 컴파일 오류를 제거하기 위해이 같은 코드를 수정 synchronized이에 대한 고정 몇 가지 예를 필요로하기 때문에

synchronized (DecibelSample.class) {} 

귀하의 코드가 작동하지 않습니다. 위의 수정 된 예제에서는 Class 인스턴스를 사용합니다.

synchronized (this) {}으로 변경할 수도 있습니다.이 경우 메소드가있는 클래스의 인스턴스가 잠금으로 사용됩니다.

private static final Object LOCK = new Object(); 

... 

public void foo() { 
    synchronized(LOCK) {} 
} 

이 아마 가장 좋은 방법이 될 것입니다, 현재 인스턴스 또는 클래스 인스턴스에 대해 몇 가지 단점이있다 잠금 이후 :

세 번째 옵션은 다음과 같이 예를 들어, 잠금 장치로 사용할 임의의 객체를 정의하는 것입니다. 자세한 내용은 SO answer을 참조하십시오.

synchronized에 대한 자세한 내용은 Java Language Specification에서 확인할 수 있습니다.

1

synchronized 키워드에는 개체가 필요합니다. DecibelSample은 Object가 아닌 클래스 이름입니다.

객체는 동기화를 보장하기 위해 사용됩니다. 즉, 스레드가 동기화 된 블록 내부에서 코드를 실행해야하는 경우 : 스레드가 객체에 대한 잠금을 획득해야합니다. 락이 스레드 의해 취득되어 수 있다면

  • 이어서 블록 내부 코드가 실행되고, 또 다른 스레드를 획득 할 수 있도록 잠금이 해제된다.

  • 잠금을 얻을 수없는 경우 : 잠금 (다른 스레드 소유)이 해제 될 때까지 스레드 대기가 해제됩니다.

    //used for locking only 
    // don't consume useless memory : a zero-sized array is fine 
    // ensure that the LOCK is shared between all threads : let's make it static 
    // ensure that the object used for locking cannot be changed by anyone : let's make it final 
    // at first sight : we don't need to synchronize on this Object in another class : keep it private. 
    private static final Object[] LOCK = new Object[0]; 
    
        ... 
        if (mDecibelSample == null) { 
         synchronized (LOCK) { 
          if (mDecibelSample == null) { 
           mDecibelSample = new DecibelSample(); 
          } 
         } 
        } 
    
    : 귀하의 경우

, 당신은 잠금 장치를 지원하는 객체가 필요

관련 문제