如果我在一个没有等待的线程上调用notify,会发生什么?

时间:2011-02-28 01:35:55

标签: c# java .net multithreading

我希望有一个位于事件队列之上的线程,并相应地对其作出反应。我的想法是清除所有元素,一旦到达队列末尾,点击wait()直到notify()为止。然而,问题是,当线程没有等待notify()时会发生什么?

P.S。:我在javadoc中一直在阅读的这个监视器业务是什么?

3 个答案:

答案 0 :(得分:6)

简短的回答是没有任何反应。

稍微长一点的答案是,如果监视器上没有任何等待,则没有任何内容可以传递通知,并且会以静默方式丢弃通知。

您一直听到的monitor只是您正在使用的原始锁定机制的技术术语。 (IIRC这个术语是由监控概念的发明者 - 托尼·霍尔(Tony Hoare)创造的 - 他在并发方面做了大量的开创性工作。)

这个想法是某些代码区域(在Java中,它们是同步的方法体和同步块),线程只有在拥有独占锁时才能执行。想要进入这些区域的其他线程必须等待锁定变为可用。 waitnotify方法提供了一种与监视器结合使用的附加信令机制。

答案 1 :(得分:4)

当另一个线程调用notify()方法时,某些线程不需要执行wait()方法。由于wait-and-notify机制不知道它发送通知的条件,它假定如果没有线程在等待,通知会闻所未闻。

换句话说,如果在没有其他线程等待时调用notify()方法,则notify()只返回并且通知丢失。稍后执行wait()方法的线程必须等待另一个通知发生。

答案 2 :(得分:1)

在回答你的PS时,监视器是基本的并发原语之一。它们有几种不同的风格,其中Java使用wait和notify变体。所有这些都在维基百科文章中得到了很好的解释:

http://en.wikipedia.org/wiki/Monitor_(synchronization)