obj.wait()
및 obj.notify()
을 수행하려면 기다리거나 알릴 대상의 모니터를 소유해야합니다. 귀하의 코드에서, 당신은 아마 thread1.notify() 싶지 않아요. 예 :
Object someSharedObject = ...
Thread1 :
synchronized(someSharedObject) {
// while NOT if for spurious wake ups.
while(!conditionFullfiled) someSharedObject.wait();
}
Thread2 :
synchronized(someSharedObject) {
if(conditionFullfiled) someSharedObject.notify(); // this wakes thread1
}
synchronized
잠금이 두 스레드가 충돌하지 않습니다 의미 (this
될 수 있습니다) someSharedObject
에 있습니다. .wait()
은 현재 보류 된 모니터를 해제하므로 Thread1이 대기 중이면 Thread2가 차단되지 않습니다.
편집 : 가짜 깨우기에 대해 알게되었습니다. .wait()
은 while
루프 - if
으로 충분하지 않아야합니다. Why do threads spontaneously awake from wait()?. Enio Shioji에게 저를 가르쳐 주셔서 감사합니다.
편집 : 명확한 .wait()
모니터가 출시되었습니다.
는'if'가 while''으로 대체되어야 읽기 가짜 깨우기에 대처하십시오. –
'someSharedObject.wait();'가 synchronized 블록 내에서 호출됩니다. Thread1이 이미 대기중인 경우 Thread2가 다른 동기화 된 블록으로 절대 들어 가지 않는다는 것을 의미하지 않습니까? – fhucho
@fhucho, wait()는 현재 보유하고있는 모니터를 해제합니다. –