在多线程的编程实践中,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