java 錯失的信號學習筆記

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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章