您的位置:首页 > 其它

关于生产者与消费者的同步锁的个人见解

2009-09-22 20:07 369 查看
生产者与消费者是经典的PV操作实例,在实际的工作环境中也起着重要的角色。

除了使用自定义的变量,“手动”控制来实现之外,多数人都认为使用多线程共享同步锁(synchronized)的机制是实现生产者消费者问题的最佳解决方案。

通过最近一段时间的实践,发现同步锁(synchronized)也有它的局限性---无法退出线程。

当生产者占有同步锁(synchronized)时,消费者处于死等状态,直到生产者唤醒消费者(notify),之后生产者将锁释放(wait),这时,消费者取得锁,生产者处于死等状态,直到消费者唤醒生产者(notify),再将消费者自己的锁释放(wait)。如此循环,锁便在生产者与消费者之间传递起来。彼此和谐交换,互不抵赖。但问题是:我们如何停止这两个家伙---生产者与消费者。

假如让生产者自然死亡,也就是将生产者线程的循环条件破坏,使其自己执行到循环之外,自然结束生产线程,但如果这样的话,必须先让消费者释放锁,到一边呆着去,等着生产者来替换它的位置,将其唤醒。可,既然生产者已经自然死亡了,那么谁来唤醒消费者?没有人!!可怜的消费者只能傻傻的在那等下去,天荒地老。同理,二者谁先死都不可能将对方也结束掉。由于这个同步锁的存在,注定他们将孤独而终,连个殉葬品都没有。

针对以上问题,当我们需要在实际环境中打破这种彼此循环,结束线程而不停止程序或者回收对象的情况下,我还是倾向于使用自定义锁。

两个bool变量,彼此使用,传递,即可顺利安全结束二者线程。当然,前提是一定控制好这个锁的状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: