关于生产者与消费者的同步锁的个人见解
2009-09-22 20:07
369 查看
生产者与消费者是经典的PV操作实例,在实际的工作环境中也起着重要的角色。
除了使用自定义的变量,“手动”控制来实现之外,多数人都认为使用多线程共享同步锁(synchronized)的机制是实现生产者消费者问题的最佳解决方案。
通过最近一段时间的实践,发现同步锁(synchronized)也有它的局限性---无法退出线程。
当生产者占有同步锁(synchronized)时,消费者处于死等状态,直到生产者唤醒消费者(notify),之后生产者将锁释放(wait),这时,消费者取得锁,生产者处于死等状态,直到消费者唤醒生产者(notify),再将消费者自己的锁释放(wait)。如此循环,锁便在生产者与消费者之间传递起来。彼此和谐交换,互不抵赖。但问题是:我们如何停止这两个家伙---生产者与消费者。
假如让生产者自然死亡,也就是将生产者线程的循环条件破坏,使其自己执行到循环之外,自然结束生产线程,但如果这样的话,必须先让消费者释放锁,到一边呆着去,等着生产者来替换它的位置,将其唤醒。可,既然生产者已经自然死亡了,那么谁来唤醒消费者?没有人!!可怜的消费者只能傻傻的在那等下去,天荒地老。同理,二者谁先死都不可能将对方也结束掉。由于这个同步锁的存在,注定他们将孤独而终,连个殉葬品都没有。
针对以上问题,当我们需要在实际环境中打破这种彼此循环,结束线程而不停止程序或者回收对象的情况下,我还是倾向于使用自定义锁。
两个bool变量,彼此使用,传递,即可顺利安全结束二者线程。当然,前提是一定控制好这个锁的状态。
除了使用自定义的变量,“手动”控制来实现之外,多数人都认为使用多线程共享同步锁(synchronized)的机制是实现生产者消费者问题的最佳解决方案。
通过最近一段时间的实践,发现同步锁(synchronized)也有它的局限性---无法退出线程。
当生产者占有同步锁(synchronized)时,消费者处于死等状态,直到生产者唤醒消费者(notify),之后生产者将锁释放(wait),这时,消费者取得锁,生产者处于死等状态,直到消费者唤醒生产者(notify),再将消费者自己的锁释放(wait)。如此循环,锁便在生产者与消费者之间传递起来。彼此和谐交换,互不抵赖。但问题是:我们如何停止这两个家伙---生产者与消费者。
假如让生产者自然死亡,也就是将生产者线程的循环条件破坏,使其自己执行到循环之外,自然结束生产线程,但如果这样的话,必须先让消费者释放锁,到一边呆着去,等着生产者来替换它的位置,将其唤醒。可,既然生产者已经自然死亡了,那么谁来唤醒消费者?没有人!!可怜的消费者只能傻傻的在那等下去,天荒地老。同理,二者谁先死都不可能将对方也结束掉。由于这个同步锁的存在,注定他们将孤独而终,连个殉葬品都没有。
针对以上问题,当我们需要在实际环境中打破这种彼此循环,结束线程而不停止程序或者回收对象的情况下,我还是倾向于使用自定义锁。
两个bool变量,彼此使用,传递,即可顺利安全结束二者线程。当然,前提是一定控制好这个锁的状态。
相关文章推荐
- 关于mysql配置主从同步,个人的见解与实现方法
- 关于网宿厦门研发中心笔试的一道PV操作题:利用java中的多线程实现生产者与消费者的同步问题
- 经典同步问题linux下的C实现:生产者-消费者问题,读者-写者问题,哲学家问题
- Linux多线程之同步2 —— 生产者消费者模型
- JAVA多线程经典问题 -- 生产者 消费者 同步队列实现方法
- 关于web程序快速开发个人见解以及经历
- 线程 同步与互斥-------消费者 生产者模型
- 同步和互斥——生产者和消费者进程版
- 关于生产者消费者排序问题
- 同步和互斥——生产者和消费者进程版
- linux中的生产者和消费者问题--信号量 互斥 同步
- 关于队列的个人见解
- 操作系统:经典进程同步问题(1)生产者-消费者问题
- 线程同步之经典生产者-消费者模型
- 并发与同步、信号量与管程、生产者消费者问题
- 关于raycast与screenpointoray的一些个人见解
- 关于rem的个人见解
- java多线程---等待/唤醒以及生产者消费者经典同步synchronized的实现
- 操作系统进程同步三大问题:生产者消费者,哲学家进餐,读者写者问题
- Java线程同步:生产者-消费者 模型(代码示例)