2012-03-01 2 views
3

wait() 메소드는 항상 동기화 된 메소드/블록으로 작성되고 Object를 잠급니다.하지만 모든 메소드가 Thread 클래스에있을 때 어떤 문제가 발생했는지 알고 싶습니다.wait, notify 및 notifyAll 메소드가 객체 클래스에있는 이유는 무엇입니까?

+0

가능한 중복 [? 왜 대기() 및 통보() 자바의 Object 클래스에 선언] (http://stackoverflow.com/questions/1769489/why-are- wait-and-notify-declared-in-javas-object-class) – gnat

답변

4

이들은 Thread 클래스에도 있습니다. 그러나 여기의 스레드 인스턴스는 다른 개체와 마찬가지로 동기화 개체로도 적합합니다.

또한 태양의 이러한 결정에 대해 의문을 제기하는 목소리가 이미 있습니다. 이제 모든 개체가 동기화 될 수있는 부담을 갖기 때문에 IMHO는 오래 전에 개체를 분리하기 위해이 개체를 리팩터링해야했습니다. 나는에 동기화 할 뭔가를해야하는 경우

, 나는 종종 수행

private Object syncObject = new Object(); 

그럼 내가 할 수있는 내 코드에서 사방

synchronized(syncObject) 

및 다른 사람 신경 필요가 없습니다 실수로 this에 동기화 중입니다.

+1

얼마나 큰 부담입니까? –

+1

각 개체는 8 바이트 헤더를 전달합니다. 객체를 동기화 할 필요가 없다면 4 바이트 헤더 (클래스 ref)가 충분할 수도 있습니다. 그러나 추가 머리글의 일부 바이트가 아직 GC에 필요한지 여부는 알 수 없지만이 정보는 여전히 4 바이트 헤더에 포함될 수 있습니다. – Daniel

4

스레드 개체에서 스레드를 사용하는 경우 문제는 스레드가이 잠금을 자체 용도로 사용한다는 것입니다. 이것은 혼란과 이상한 버그로 이어질 가능성이 있습니다.

1

이러한 메소드의 컨텍스트는 Java의 모든 객체와 관련된 잠금이므로 Thread 클래스로 이동할 수 없습니다. 예를 들어 우리는 이렇게 할 수 있습니다. 스레드 1은 항목을 목록에 추가하고 다른 스레드에 알립니다. 스레드 2는 목록 업데이트를 기다리고 다음과 같이 처리합니다.

thread 1 
synchronized (lock) { 
    list.add(item); 
    lock.notifyAll();  
} 

thred 2 
synchronized (lock) { 
    list.wait(); 
    ... do something with list 
} 

이러한 방법을 스레드로 옮기면 여기에서 수행 한 작업이 불가능합니다.

관련 문제