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;
}
이 코드에는 문제가 없습니다. 내가 잘못하지 않는다면,'get' 구현은'public static synchronized Object get() {/ * get object return * /}'과 동등해야합니다. 부조화의 원인은 보여주지 않는 코드일까요? 스레드 생성,'get' 호출과 최소한의'get' 구현을 추가하는 등 문제를 보여주는 최소한의 실제 예제를 보여줄 수 없습니까? –
클래스 객체를 잠금으로 사용하지 않은 또 다른 이유는 다른 클래스가 동기화를 시도 할 수 있기 때문입니다. 교착 상태 및 지연 가능성. – TedTrippin
불행히도 일관성없는 상태를 재현 할 수 없습니다. 귀하의 코드는 나에게 잘 보이지만 어쩌면 나는 오류가 보이지 않습니다. 그러나, 당신이'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 –