08-在同步代码块中使用条件
2.3 在同步代码块中使用条件
生产者-消费者问题是并发编程领域中的经典问题。在生产者-消费者模型中,数名生产者都写入数据到同一个数据缓存中,在数据缓存的另一端,又有数名消费者都向数据缓存汲取数据。
可以注意到在这个模型中,数据缓存是共享的数据结构,因此需要通过一些同步化机制(如之前提到的 synchronized
关键词)来控制对该共享数据结构的访问。不过,对于这个数据结构还要考虑一些别的情况。比如,当数据缓存满时,生产者不能写入数据到数据缓存中。同样,消费者也不能从空的数据缓存中读取到数据。
为了解决这些问题,Java在 Object
类上提供了接口函数 wait()
、 notify()
和 notifyAll()
。程序可以在线程里调用 wait()
方法。如果此时程序在线程外调 wait()
方法,则JVM会抛出一个 IllegalMonitorStateException
异常。使用 wait()
方法后,当前线程将进入休眠状态,并与此同时释放当前线程正在执行的 synchronized
代码块以允许其他线程能够进入由同一个对象绑定的 synchronized
代码块。除此之外,开发者还可以通过在同一个对象绑定的 synchronized
代码块中调用 notify()
或 notifyAll()
方法来唤醒通过 wait()
方法沉睡的线程。
本节将帮助你了解如何通过 synchronized
和 wait()
、 notify()
以及 notifyAll()
等方法来有效地处理生产者-消费者的问题。