虚假唤醒:其实就是唤醒了不该唤醒的线程,假如我们店里只要一件衣服,而我们却通知来了5位顾客,此时我们店里就剩下了-4件衣服。
带大家理解一下代码
现在有两个生产者线程,两个消费者线程,现在物品有0个
生产者
if (product > 0) {
this.wait();
}
product++;
System.out.println(Thread.currentThread().getName() + "添加产品,剩余" + product + "件产品");
this.notifyAll();
消费者
if (product == 0) {
this.wait();
}
product--;
System.out.println(Thread.currentThread().getName() + "使用产品,剩余" + product + "件产品");
this.notifyAll();
此时消费者1进行等待,释放锁,并唤醒其他线程,此时消费2可能会拿到锁,并且也进入等待,释放锁,并唤醒其他线程,然后生产者1可能会拿到锁,生产一个产品,产品数量为1,释放锁并唤醒其他线程,此时消费者1会接着往下执行消费1个物品,之后消费者2也会接着往下执行消费一个产品,物品数量就变为了-1,
虚假唤醒的解决方式很简单,将if 变为while即可,因为我们的if只进行了一次判断,它就接着往下执行了,所以我们使用while可能让一直判断,直到符合条件才接着往下执行