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