2014-11-04 2 views
0

ThreadMyClass.class이 고유하기 때문에 다음 사용은 동기화 된 블록을 생성한다고 생각했습니다. 그러나 여러 개의 스레드가 많은 수의 트래픽을 생성하여 get() 메서드에 액세스하지 못했을 때 많은 불일치 상태가 만들어 짐을 발견했습니다. 그래서 스레드가 ThreadMyClass.class 인스턴스와 동기화되지 않는 이유는 무엇입니까?클래스와 스레드 동기화 된 블록

내가 lock 개체와 ThreadMyClass.class을 변경 한
public ThreadMyClass { 


public Object get(){ 

    synchronized (ThreadMyClass.class) { 
    //get object return 
    } 

} 
} 


public static final Object lock = new Object(); 

, 모든 것이 잘 작동한다.

업데이트 : 여기 내 전체 코드 부분 인스턴스 생성 블록이 두 번 이상 호출됩니다.

public static XmppInterface getInstance() throws XMPPException { 
     if (instance == null) { 
     synchronized (XmppInterface.class) { 
      if (instance == null) { 
       //create an instance 
      } 
     } 
     } 
     return instance; 
    } 
+1

이 코드에는 문제가 없습니다. 내가 잘못하지 않는다면,'get' 구현은'public static synchronized Object get() {/ * get object return * /}'과 동등해야합니다. 부조화의 원인은 보여주지 않는 코드일까요? 스레드 생성,'get' 호출과 최소한의'get' 구현을 추가하는 등 문제를 보여주는 최소한의 실제 예제를 보여줄 수 없습니까? –

+1

클래스 객체를 잠금으로 사용하지 않은 또 다른 이유는 다른 클래스가 동기화를 시도 할 수 있기 때문입니다. 교착 상태 및 지연 가능성. – TedTrippin

+0

불행히도 일관성없는 상태를 재현 할 수 없습니다. 귀하의 코드는 나에게 잘 보이지만 어쩌면 나는 오류가 보이지 않습니다. 그러나, 당신이'XmppInterface'에 Singleton-property를 적용하려는 것처럼 보이기 때문에 열거 형을 사용하여 이것을 해결할 수도 있습니다 : Effective Java에서 Item 3을보십시오 : http://uet.vnu.edu.vn/ ~ chauttm/e-books/java/Effective.Java.2nd.Edition.May.2008.3000th.Release.pdf –

답변

2

글쎄, 당신의 class를 통해 동기화 된 아닌 static synchronized 방법을 가진 동등했다 그것의 인스턴스.

클래스 인스턴스를 통해 동기화하려면 synchronized 인스턴스 메서드를 사용할 수 있습니다.

그렇지 않으면 잠금에 사용 된 Object을 통해 동기화하면 해당 Object에서만 동기화되고 나머지 정적 및 인스턴스 메서드는 동기화 전략에서 "자유"상태로 남습니다.

+0

웹 사이트에 따르면, 내 사용법은 정확합니다. ClassLevel 잠금을 사용하고 있습니다. http://howtodoinjava.com/2013/03/08/thread-synchronization-object-level-locking-and-class-level-locking/ –

+1

@ mmc18에서 기사를 빠르게 보았습니다. 그것은 기본적으로 "객체 레벨 잠금"(객체 잠금과 인스턴스 잠금을 모두 포함하는 것)과 클래스 레벨 잠금이라는 차이점을 강조합니다. 실제'java.util.concurrent.locks.Lock' 등을 사용하는 것과 같이 거기에서 무언이 사용되지 않는 다른 관용구들도 있습니다. 모두 문맥과 당신이 달성하고자하는 것에 달려 있습니다. – Mena