notify()vs notifyAll()?

时间:2014-03-16 11:18:36

标签: java multithreading

我遇到了Java: notify() vs. notifyAll() all over again,但仍然无法满足自己。

xagyg解释得非常好,但最终记住这个概念变得非常复杂。

我在这里用简单的日常生活例子尽我所能,以便我和其他人可以回到这个,如果有人忘记。我的理解来源 是xagyg在上面的链接回答,但试图简单地把事情放在这里。

说两个人去电影院找到它的房子。但随后票房的人说乔恩告诉他们这里有一张票 保留给总统。如果他不来,他会把它卖掉。然后伙计们告诉琼,好的,我们正在附近的酒店等候,拜托 收到任何信息后通知我们。这些家伙去酒店睡觉。现在总统没有出现,现在乔恩有两个选择 首先是通知其中一个人,让其他人睡觉。如果他这样做,那么可以去看电影而其他人可能会继续睡觉(直到 他没有得到通知。我假设这个家伙一年没有睡觉:))。另一个选择是他通知(唤醒)他们两个, 选择其中任何一个(在实际的java示例程序中不选择,但其vm /线程调度程序)用于电影。在这种情况下,他会将其他人留在酒店房间,因为他可以创建某种问题:(。现在一次 节目结束,如果门票可用,这家伙可以去下一场演出。将票证视为锁,将剧院视为对象。这究竟是什么 notify和notifyAll。所以很明显notifAll在混乱时比通知更好

现在考虑生产者/消费者的例子。

说两个消费者线程正在等待商店生产。现在制作人做了什么,他在单曲和退出中制作了两个项目。现在,如果生产者使用通知,只有一个线程可以消费,而其他线程将继续等待永久。

但是如果生产者在这里使用notifyAll(),那么两个线程都可以一次消费一次

如果我的理解是正确的,请告诉我?

1 个答案:

答案 0 :(得分:0)

我不认为你在上一个陈述中写的是正确的。每次生产者生成一个对象时,它应该通知一个消费者,所以如果创建了两个对象,它应该两次调用notify而不是一次。这样,如果您使用notify而不是notifyAll,您仍然可以使用两个使用者线程