2011-09-04 2 views
6

에 대한 액세스를 동기화합니다. 메소드가 정적 필드를 수정하면 클라이언트가 해당 필드에 대한 외부 동기화를 수행 할 수 없으므로이 필드에 대한 액세스를 동기화해야한다고 언급했습니다. 방법. 클라이언트가 정적 메서드에서 외부 동기화를 수행 할 수 없다는 것을 어떻게 이해할 수 있습니까?은 Josh Bloch의 Effective Java 항목 67에있는 정적 필드

내부 동기화 구현 :

public class Serial { 
    private static int serialNumber = 0; 

    public synchronized static void incSerial() { 
     serialNumber++; 
    } 

} 

에는 내부 동기화를 구현하지 않는 경우, 클라이언트는 외부 동기화 할 수 있습니다 :

synchronize(Serial.class) { 

    Serial.incSerial(); 
} 

어떤 아이디어?

+1

btw 정확한 견적을 제공하고이 페이지를 알려주십시오. 나는 블로흐가 명확하고 정확한 것으로 기대할 것이다. – Bozho

답변

6

클라이언트가이를 수행 할 수 있지만 강제로 동기화 할 수는 없습니다. 따라서 일부 클라이언트는 비동기 액세스를 수행하고 모든 것을 중단 할 수 있습니다.

+1

잘, 예제는 사소할 것이다. 하나의 클라이언트는 syncrhonizes이고 다른 하나는 그렇지 않다. 따라서 동기화되지 않은 코드를 사용하는 다중 스레드는 동기화 문제가 발생하기 쉽습니다. – Bozho

0

정적 인스턴스 변수를 보유하는 클래스와 관련된 잠금을 사용해야합니다. 이전에 동기화 된 블록으로 획득 한 다음 정적 메서드를 호출하면 문제가 없습니다. 그러나 클라이언트 코드에이를 적용 할 수 없습니다. 그들은 특정 정적 변수가 다른 스레드에서도 사용된다는 것을 잊거나 잊을 수도 있습니다. 그래서 Bozho가 제안한 것처럼 정적 메소드를 동기화하고 인스턴스 변수를 private로 설정하는 것이 최선의 방법입니다.

티 베리우스

+0

사람들이 한 가지 더 중요한 것입니다. 그 견적에서 블로치는 "이 필드가 단일 스레드에서 사용되는 경우에도이 필드에 대한 액세스를 동기화해야합니다"라고 언급했습니다. 단일 스레드에 의해 사용되는 경우 왜 synhcronize하는 데 필요한 이유는 무엇입니까? – Hitesh