当前位置:嗨网首页>书籍在线阅读

08-在同步代码块中使用条件

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.3 在同步代码块中使用条件

生产者-消费者问题是并发编程领域中的经典问题。在生产者-消费者模型中,数名生产者都写入数据到同一个数据缓存中,在数据缓存的另一端,又有数名消费者都向数据缓存汲取数据。

可以注意到在这个模型中,数据缓存是共享的数据结构,因此需要通过一些同步化机制(如之前提到的 synchronized 关键词)来控制对该共享数据结构的访问。不过,对于这个数据结构还要考虑一些别的情况。比如,当数据缓存满时,生产者不能写入数据到数据缓存中。同样,消费者也不能从空的数据缓存中读取到数据。

为了解决这些问题,Java在 Object 类上提供了接口函数 wait()notify()notifyAll() 。程序可以在线程里调用 wait() 方法。如果此时程序在线程外调 wait() 方法,则JVM会抛出一个 IllegalMonitorStateException 异常。使用 wait() 方法后,当前线程将进入休眠状态,并与此同时释放当前线程正在执行的 synchronized 代码块以允许其他线程能够进入由同一个对象绑定的 synchronized 代码块。除此之外,开发者还可以通过在同一个对象绑定的 synchronized 代码块中调用 notify()notifyAll() 方法来唤醒通过 wait() 方法沉睡的线程。

本节将帮助你了解如何通过 synchronizedwait()notify() 以及 notifyAll() 等方法来有效地处理生产者-消费者的问题。