背景: 在编写生产者 / 消费者代码时, 遇到了一些奇怪的现象, 例如超额生产 / 超额消费, 而这些的原因是由于我们对 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 () 的状态