wait() 메소드는 항상 동기화 된 메소드/블록으로 작성되고 Object를 잠급니다.하지만 모든 메소드가 Thread 클래스에있을 때 어떤 문제가 발생했는지 알고 싶습니다.wait, notify 및 notifyAll 메소드가 객체 클래스에있는 이유는 무엇입니까?
답변
이들은 Thread 클래스에도 있습니다. 그러나 여기의 스레드 인스턴스는 다른 개체와 마찬가지로 동기화 개체로도 적합합니다.
또한 태양의 이러한 결정에 대해 의문을 제기하는 목소리가 이미 있습니다. 이제 모든 개체가 동기화 될 수있는 부담을 갖기 때문에 IMHO는 오래 전에 개체를 분리하기 위해이 개체를 리팩터링해야했습니다. 나는에 동기화 할 뭔가를해야하는 경우
, 나는 종종 수행
private Object syncObject = new Object();
그럼 내가 할 수있는 내 코드에서 사방
synchronized(syncObject)
및 다른 사람 신경 필요가 없습니다 실수로
this
에 동기화 중입니다.
얼마나 큰 부담입니까? –
각 개체는 8 바이트 헤더를 전달합니다. 객체를 동기화 할 필요가 없다면 4 바이트 헤더 (클래스 ref)가 충분할 수도 있습니다. 그러나 추가 머리글의 일부 바이트가 아직 GC에 필요한지 여부는 알 수 없지만이 정보는 여전히 4 바이트 헤더에 포함될 수 있습니다. – Daniel
스레드 개체에서 스레드를 사용하는 경우 문제는 스레드가이 잠금을 자체 용도로 사용한다는 것입니다. 이것은 혼란과 이상한 버그로 이어질 가능성이 있습니다.
이러한 메소드의 컨텍스트는 Java의 모든 객체와 관련된 잠금이므로 Thread 클래스로 이동할 수 없습니다. 예를 들어 우리는 이렇게 할 수 있습니다. 스레드 1은 항목을 목록에 추가하고 다른 스레드에 알립니다. 스레드 2는 목록 업데이트를 기다리고 다음과 같이 처리합니다.
thread 1
synchronized (lock) {
list.add(item);
lock.notifyAll();
}
thred 2
synchronized (lock) {
list.wait();
... do something with list
}
이러한 방법을 스레드로 옮기면 여기에서 수행 한 작업이 불가능합니다.
이러한 메소드는 잠금에 대해 작동하며 잠금은 오브젝트가 아닌 스레드와 연관됩니다. 따라서 Object 클래스에 있습니다.
wait(), notify() 및 notifyAll() 메서드는 메서드뿐 아니라 동기화 유틸리티이며 Java의 스레드 간의 통신 메커니즘에 사용됩니다. 더 설명은
읽기 : Why wait() ,notify() and notifyAll() methods are in Object class instead of Thread class?
의- 1. 동기화 된 명령문 내에서 wait(), notify() 및 notifyAll()이 동기화되었습니다.
- 2. java에서 wait, notify 및 notifyall을 사용 하시겠습니까?
- 3. ConcurrentLinkedQueue with wait() 및 notify()
- 4. 스레드가 wait() 및 notify() 다음에 메시지를 잃습니다.
- 5. 여러 스레드에서 wait 및 notify 프로토콜을 사용하는 방법
- 6. Java - notifyAll() 및 notify()가 실패 했습니까? 가능한가?
- 7. WAKEUP은 notify/notifyall 컨텍스트에서 실제로 무엇을 의미합니까?
- 8. Java에서 synchronized()/wait()/notifyAll()은 무엇을합니까?
- 9. GetHashCode가 Object 클래스에있는 이유는 무엇입니까?
- 10. 안드로이드 게임에서 메소드 또는 wait()/notify()를 생성하는 방법
- 11. wait-notify와 CountDownLatch의 차이점
- 12. 의 notifyAll
- 13. new to multithreading - Java에서 wait() 및 notify()를 사용하는 방법은 무엇입니까?
- 14. 호출 객체 메소드가 다른 객체
- 15. 스레드가 wait()에서 자발적으로 깨어있는 이유는 무엇입니까?
- 16. head.ready() 및 $ (document) .ready(), Wait For Wait
- 17. 지시 된 notifyAll()
- 18. Google 애널리틱스 추적 코드의 모든 메소드가 밑줄로 시작하는 이유는 무엇입니까?
- 19. addRequestHeader 메소드가 필요한 이유는 무엇입니까?
- 20. 각 메소드가 호출되는 이유는 무엇입니까?
- 21. 다른 스레드가 wait() ing인지 확인하는 방법은 무엇입니까?
- 22. Integer에서 동기화 할 때 notifyAll()이 IllegalMonitorStateException을 발생시키는 이유는 무엇입니까?
- 23. wait()/wait (timeout)/sleep (timeout)?
- 24. wait() 및 notify()를 사용하여 게임 스레드 일시 중지/다시 시작 - Android
- 25. KnockoutJS 별도의 클래스에있는 객체 배열에 액세스하기
- 26. Ruby 및 Ubuntu의 Notify-OSD
- 27. 다른 클래스에있는 객체 배열에서 단일 객체에 액세스합니다.
- 28. Java의 AbstractList의 removeRange() 메소드가 보호되는 이유는 무엇입니까?
- 29. 레일에서 메소드가 정의되지 않은 이유는 무엇입니까?
- 30. WCF 반환 형식 내가 WCF 메소드가 객체
가능한 중복 [? 왜 대기() 및 통보() 자바의 Object 클래스에 선언] (http://stackoverflow.com/questions/1769489/why-are- wait-and-notify-declared-in-javas-object-class) – gnat