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();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43916777/article/details/104364439