使用 wait notify notifyAll 的常见问题

背景: 在编写生产者 / 消费者代码时, 遇到了一些奇怪的现象, 例如超额生产 / 超额消费, 而这些的原因是由于我们对 wait notify notifyAll 的理解不正确

下面有一些多线程下使用 wait notify notifyAll 注意事项

  • wait notify notifyAll 都要放在 synchronized 方法 / 代码块中, 否则运行异常 java.lang.IllegalMonitorStateException
  • 务必在 while 而不是 if 中使用 wait (). 因为当 wait () 被唤醒后, 此时条件可能已经改变, 是需要应该再次校验是否满足条件, 而不是直接往下运行代码. 索引使用 while 而不是 if
  • 使用 notifyAll () 而不是 notify (). notify () 表示通知某一个线程, 而 notifyAll () b 表示通知所有等待此锁的线程. 因为在多线程下, 如果仅仅使用 notify () 来通知其他线程, 可能会通知到相同类型的线程, 例如消费者线程通知到其他消费者线程, 这会导致生产者线程无法被通知到, 一直处于 wait () 的状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值