T1:
synchronized(shareMonitor){
<setup condition for T2>
shareModitor.notify();
}
T2:
while(someCondition){
//Point1
synchronized(shareMonitor){
shareMonitor.wait();
}
}
以上代碼存在死鎖情況。假若T2計算條件值爲true,在Point1中,線程調度器可能切換到T1。而T1將執行其設置,然後調用notify()。當T2得以繼續執行,此時對T2來說,實際已經太晚,以至於不能意識到這個條件已經變化,因此會盲目的進入wait()一直等待下去,導致死鎖。
對此的解決方法如下:
T1:
synchronized(shareMonitor){
<setup condition for T2>
shareModitor.notify();
}
T2:
synchronized(shareMonitor){
while(someCondition){
shareMonitor.wait();
}
}