通俗易懂理解虚假唤醒

虚假唤醒:其实就是唤醒了不该唤醒的线程,假如我们店里只要一件衣服,而我们却通知来了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可能让一直判断,直到符合条件才接着往下执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值