`
javahigh1
  • 浏览: 1276677 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

生产者与消费者问题

 
阅读更多

多线程编程中的一个典型问题是生产者与消费者问题,这是线程同步或者说是线程间通信的一个典型实例。这里再简单复习一下吧。
在这个问题中,有一个生产者负责源源不断地生成产品放入仓库,还一个消费者源源不断地从仓库中提出产品。仓库有一个固定的容量,仓库满的时候生产者的操作要暂时挂起等待仓库有空间时再放入产品,当仓库空的时候,消费者提取产品的工作也会挂起,等待仓库中有产品放入后再继续。因此说,存放产品和提取产品是两个需要同步的操作,或者准确地说:消费者的消费操作和生产者的生产操作是可以同步进行的(并发执行),但同时它们之间又必须通过一定的机制来相互的协调,在某些特殊的时刻,让谁先执行,谁后执行,才能避免出现上述问题。
在java中,这个问题就是通过wait和notify来实现的。注意:wait和notify必须放在同步块中!一般情况是同步块的加锁对象就是wait和notify的从属对象。wait方法将释放当前对象的锁,这样当前线程就被置于block状态(因为当前线程在当前对象上是同步的),以便其他线程可以执行,直到它需要的某个条件由其他线程实现了。而notify方法正是那个实现了某个条件的线程用来通知虚拟机,可以尝试唤醒其他线程了。等到这个线程执行完毕,归还了当前对象的锁,某个被唤醒的线程会得到这个锁,比如说前一个wait的线程,这时候它们条件已经满足,因而可以继续执行下去了。
wait和notify与同步机制的关系: “竞争条件”是指两个以上的线程会因为执行顺序的不同而导致程序变量或是返回值的不同。这样必然会出现错误的结果,这种错误的结果有一种叫法:共享数据的腐蚀。同步机制正是用来解决“竞争条件”问题的。但是仅有同步是不够的,本质上,同步是确保共享数据能被线程安全地访问, 它是从“ 隔离 线程”角度来安排线程的推进的。但是线程除了需要隔离,还需要相互通信,以协调地完成一项工作,这正是wait和notify的作用。以下是Java Theads一书的摘入:

The wait-and-notify mechanism is a synchronization mechanism. However, it is more of a communication mechanism: it allows one thread to communicate to another thread that a particular condition has occurred. The wait-and-notify mechanism does not specify what the specific condition is.

Can the wait-and-notify mechanism be used to replace the synchronized mechanism? Actually, the answer is no; wait-and-notify does not solve the race condition problem that the synchronized mechanism solves. As a matter of fact, wait-and-notify must be used in conjunction with the synchronized lock to prevent a race condition in the wait-and-notify mechanism itself.

下面是生产者与消费者的代码:

Store:仓库类

Producer:生产者

Consumer:消费者


分享到:
评论

相关推荐

    pv操作解决生产者与消费者问题

    此外,pv操作还可以广泛应用于各种生产者消费者问题的解决中,使得系统更为可靠和高效。 pv操作是解决生产者与消费者问题的常用方法之一。通过pv操作,我们可以确保生产者进程和消费者进程之间的同步,避免数据的...

    操作系统中生产者与消费者问题实例

    操作系统中的生产者与消费者问题是多线程编程中的一个经典模型,它主要研究的是如何有效地在共享资源之间协调生产者和消费者的行为,以避免数据竞争和死锁等问题。在这个C#编写的实例中,我们将深入探讨这个问题及其...

    进程同步实验——生产者与消费者问题算法实现

    在这个实验“进程同步实验——生产者与消费者问题算法实现”中,我们探讨了一个经典的并发问题:生产者-消费者问题。 生产者-消费者问题是多线程编程中的一种典型应用场景,模拟了实际生产流水线的过程。在这个问题...

    操作系统生产者与消费者问题Java简单模拟实现

    总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...

    操作系统实验之进程的互斥与同步(生产者与消费者问题)VC++

    例如,在生产者与消费者问题中,有一个缓冲区作为共享资源,生产者将产品放入缓冲区,而消费者则从缓冲区取出产品。为了保证数据的一致性,必须确保在任何时候,缓冲区要么只允许一个生产者写入,要么只允许一个消费...

    进程同步与互斥 生产者与消费者问题--操作系统大作业

    ### 进程同步与互斥:生产者与消费者问题 #### 一、基础知识与概念解析 **1.1 操作系统的基本概念** 操作系统(Operating System, OS)是计算机系统的核心软件,负责管理和协调计算机硬件资源及软件资源。它通过...

    生产者与消费者问题(操作系统)

    生产者与消费者问题(操作系统)

    生产者与消费者问题(C++)

    在生产者与消费者问题中,可以使用两个信号量分别控制生产者和消费者对缓冲区的操作。 - **互斥锁**:另一种常见的同步机制,用于确保同一时间只有一个进程能够访问临界资源。在本例中,可以使用互斥锁来防止生产者...

    C例子:生产者与消费者问题

    该程序是我写的博客“一起talk C栗子吧(第一百零六回:C语言实例--生产者与消费者问题二)”的配套程序,共享给大家使用

    模拟生产者与消费者问题

    “生产者---消费者”问题是最著名的进程同步问题。它描述了一组生产者向一组消费者提供产品,它们共享一个有界缓冲区,生产者向其中投放产品,消费者从中取得产品。它是许多相互合作进程的抽象,如输入进程与计算...

    大连理工大学软件学院操作系统实验 生产者与消费者问题代码答案

    大连理工大学软件学院操作系统实验 生产者与消费者问题代码 热乎出炉 复制粘贴即能运行 !

    生产者与消费者问题Linux实现

    操作系统概念第七版第七单元实验 生产者与消费者问题linux下pthread代码 注释:此为刚完成的代码 请下载者主动修改 谢谢---mayy

    操作系统实验-模拟生产者与消费者问题

    操作系统实验中的“生产者与消费者问题”是一个经典的多线程同步问题,源于计算机科学理论,主要探讨如何在并发环境中有效地管理共享资源。本实验通过使用C#编程语言来模拟这个问题,帮助学生理解线程同步、互斥访问...

    java生产者与消费者问题

    在解压缩后的"proandcom"文件中,可能包含了进一步的代码示例或详细的解释,你可以查看这些文件以加深对生产者消费者问题的理解。同时,为了优化性能和避免死锁,编写多线程程序时,需要遵循良好的设计原则,例如...

    生产者与消费者问题 操作系统课程设计

    ### 生产者与消费者问题详解 #### 一、生产者-消费者问题背景 生产者-消费者问题是计算机科学中一个非常经典的进程同步问题。它通常用来描述一组“生产者”线程向缓冲区添加数据,而另一组“消费者”线程从缓冲区...

Global site tag (gtag.js) - Google Analytics