我把 notifyAll() 的位置改动了一下,发现也可以运行。但是不知道这样写是否会出现隐藏的问题,请老师解答。
消费者:
public class Consumer extends Thread{
@Override
public void run() {
while (true) {
synchronized (Desk.lock) {
// true 代表桌上有食物
if (Desk.flag) {
System.out.println("消费者正在取餐");
Desk.flag = false;
//Desk.lock.notifyAll();
} else {
// false 代表桌上没有食物,消费者需要等待
try {
// 把 notifyAll() 写在这里
Desk.lock.notifyAll();
Desk.lock.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
}
生产者:
public class Producer extends Thread{
@Override
public void run() {
while (true) {
synchronized (Desk.lock) {
if (Desk.flag) {
try {
// notifyAll() 写在这里
Desk.lock.notifyAll();
Desk.lock.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else {
System.out.println("通知消费者吃饭");
Desk.flag = true;
// Desk.lock.notifyAll();
}
}
}
}
}