我偶然遇到了Java: notify() vs. notifyAll() all over again,但仍然不能满足自己。
xagyg很好地解释了这一点,但最终它变得非常复杂,很难记住这个概念。
我在这里用简单的日常生活例子尽我最大的努力,这样如果有人忘记了,我和其他人可以回到这里。我的理解来源是上面链接中的xagyg回答,但试图简化这里的事情。
假设有两个人去电影院,发现电影院里座无虚席。但是票房人员说,乔恩告诉他们,有一张票是留给总统的。如果他不来,他就会把它卖掉。然后告诉乔恩,好的,我们在附近的酒店等着,有什么消息请通知我们。这些家伙去酒店睡觉。现在总裁没有露面,现在乔恩有两个选择,第一个是通知其中一个人,让其他人睡觉。如果他这样做了,一个人可以去看电影,而另一个人可能会继续睡觉(直到他没有得到通知。我假设这家伙有一年没有睡觉了:))。另一种选择是他通知(唤醒)他们两个,选择他们中的任何一个(在实际的java示例程序中没有选择,而是它的vm/线程调度器) movie.In,这种情况下,他将把其他人留在酒店房间,因为他可以制造某种问题:(。一旦演出结束,如果有票的话这个人就可以去看下一场演出了。将票证视为锁,将剧院视为对象。notify和notifyAll就是这样做的。因此,很明显,当遇到混乱时,notifAll比通知更好
现在考虑生产者/消费者的例子。
假设有两个消费者线程在商店中等待生产。现在producer所做的是,他在单次go和exit中生产两个项目。现在,如果生产者使用notify,那么只有一个线程可以使用,而其他线程将永远等待。
但是,如果生产者在这里使用notifyAll(),那么两个线程都可以一次使用一个
让我知道我的理解是否正确?
发布于 2014-03-16 19:59:22
我认为你在最后一句话中写的不正确。生产者每次产生一个对象都应该通知消费者,所以如果创建了两个对象,它应该调用两次通知,而不是只调用一次。这样,如果您使用notify而不是notifyAll,您仍然可以同时使用两个使用者线程
https://stackoverflow.com/questions/22436132
复制相似问题