2011-02-28 5 views
3

나는 이벤트 큐의 맨 위에 앉아 그에 따라 반응하는 쓰레드를 원한다. 내 아이디어는 모든 요소를 ​​지우는 것이 었습니다. 일단 큐의 끝에 도달하면 이 될 때까지 wait()을 누르십시오. 그러나 스레드가 대기하지 않을 때 notify()이 발생하면 어떻게됩니까?기다리지 않는 스레드에서 알림을 호출하면 어떻게됩니까?

P.S. : 나는 javadoc에서 계속 읽고있는 모니터 사업은 무엇입니까?

답변

6

짧은 대답은 아무 일도 없다는 것입니다.

약간 긴 대답은 모니터에서 아무 것도 기다리지 않으면 전달할 알림이없고 알림이 자동으로 삭제된다는 것입니다.

계속 듣고있는 monitor은 사용중인 기본 잠금 메커니즘에 대한 전문 용어입니다. (IIRC라는 용어는 모니터 개념의 발명가 인 Tony Hoare가 동시성에 관해 많은 연구를 한 사람입니다.)

아이디어는 특정 코드 영역 (Java에서는 동기화 된 메소드 본문 및 동기화 된 블록)은 스레드가 단독 잠금을 보유하고있는 경우에만 실행할 수 있습니다. 이 영역에 들어가기를 원하는 다른 스레드는 잠금을 사용할 수있게 될 때까지 기다려야합니다. waitnotify 메서드는 모니터와 함께 사용되는 추가 신호 메커니즘을 제공합니다.

4

다른 스레드가 notify() 메소드를 호출 할 때 일부 스레드가 wait() 메소드를 실행할 필요는 없습니다. 대기 및 통지 메커니즘이 통지를 보내는 조건을 알지 못하기 때문에, 대기중인 스레드가 없으면 알림이 들리지 않습니다.

다른 말로 대기중인 스레드가 없을 때 notify() 메서드가 호출되면 notify()가 단순히 반환되고 알림이 손실됩니다. 나중에 wait() 메소드를 실행하는 스레드는 다른 통지가 발생할 때까지 대기해야합니다.

1

PS에 대한 응답으로 모니터는 기본 동시성 기본 요소 중 하나입니다. 자바의 대기 및 알림 변형을 사용하는 몇 가지 다른 맛이 있습니다. 이 모든 잘 위키 백과 문서에 설명되어 있습니다 :

http://en.wikipedia.org/wiki/Monitor_(synchronization)

관련 문제