java的Thread线程中,为何wait()必定要放在while循环中,而不是if条件中

在多线程的编程实践中,wait()的使用方法以下:java

synchronized (monitor) {
    //  判断条件谓词是否获得知足
    while(!locked) {
        //  等待唤醒
        monitor.wait();
    }
    //  处理其余的业务逻辑
}


那为何非要while判断,而不采用if判断呢?以下:编程

synchronized (monitor) {
    //  判断条件谓词是否获得知足
    if(!locked) {
        //  等待唤醒
        monitor.wait();
    }
    //  处理其余的业务逻辑
}



这是由于,若是采用if判断,当线程从wait中唤醒时,那么将直接执行处理其余业务逻辑的代码,但这时候可能出现另一种可能,条件谓词已经不知足处理业务逻辑的条件了,从而出现错误的结果,因而有必要进行再一次判断,以下:多线程

synchronized (monitor) {
    //  判断条件谓词是否获得知足
    if(!locked) {
        //  等待唤醒
        monitor.wait();
        if(locked) {
            //  处理其余的业务逻辑
        } else {
            //  跳转到monitor.wait(); 
        }
    }
}

书上给予的解释是:线程

永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠先后都检查wait的条件,并在条件实际上并未改变的状况下处理唤醒通知。code

结论:it

就是用if判断的话,唤醒后线程会从wait以后的代码开始运行,可是不会从新判断if条件,直接继续运行if代码块以后的代码,而若是使用while的话,也会从wait以后的代码运行,可是唤醒后会从新判断循环条件,若是不成立再执行while代码块以后的代码块,成立的话继续wait。class

相关文章
相关标签/搜索