如何通过 Object.wait() 和 notify() 实现多线程生产者-消费者模型协作?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1088个文字,预计阅读时间需要5分钟。
因为这两个方法必须在同步上下文中执行——也就是说,当前线程必须保持对相应对象的监视器锁。否则,会抛出IllegalMonitorStateException。常见错误是忘记添加synchronized块,或者锁的对象和调用wait()的对象不一致。
正确做法是:所有对共享缓冲区的操作(读/写/等待)都必须在同一个锁对象上同步,通常就是缓冲区实例本身。
- 用
synchronized(buffer)包裹所有涉及wait()/notify()的逻辑 - 避免用
this或新创建的锁对象,否则生产者和消费者无法看到彼此的通知 -
wait()一定要放在while循环里判断条件,不能用if——防止虚假唤醒
如何用 wait()/notify() 实现带边界检查的阻塞队列
核心是把“缓冲区满”和“缓冲区空”作为两个独立等待条件,通过同一个锁对象协调。
示例中用一个 ArrayList 模拟固定容量队列,生产者在满时 wait(),消费者在空时 wait();任一操作完成后都调用 notifyAll()(不是 notify()),确保不会漏掉等待方。
本文共计1088个文字,预计阅读时间需要5分钟。
因为这两个方法必须在同步上下文中执行——也就是说,当前线程必须保持对相应对象的监视器锁。否则,会抛出IllegalMonitorStateException。常见错误是忘记添加synchronized块,或者锁的对象和调用wait()的对象不一致。
正确做法是:所有对共享缓冲区的操作(读/写/等待)都必须在同一个锁对象上同步,通常就是缓冲区实例本身。
- 用
synchronized(buffer)包裹所有涉及wait()/notify()的逻辑 - 避免用
this或新创建的锁对象,否则生产者和消费者无法看到彼此的通知 -
wait()一定要放在while循环里判断条件,不能用if——防止虚假唤醒
如何用 wait()/notify() 实现带边界检查的阻塞队列
核心是把“缓冲区满”和“缓冲区空”作为两个独立等待条件,通过同一个锁对象协调。
示例中用一个 ArrayList 模拟固定容量队列,生产者在满时 wait(),消费者在空时 wait();任一操作完成后都调用 notifyAll()(不是 notify()),确保不会漏掉等待方。

