Java中的wait()和notify()如何工作?

时间:2018-08-17 00:20:54

标签: java multithreading wait notify

我不熟悉OS /多线程,我想知道wait()notify()如何一起工作。我刚刚看到了这个:Producer Consumer Solution in Java

我有点困惑。假设我以wait()方法调用了PC.consume()。当我到达notify()中写着PC.produce()的那一行时,PC.consume()中的等待如何知道那是被通知的那个?可能还有其他地方可以通知,所以它如何确切知道要通知哪个地方?

谢谢!

1 个答案:

答案 0 :(得分:0)

在同一对象上调用“等待”和“通知”,该对象被用作锁(在本例中为局部变量pc引用的对象)。 javadoc(此处是notify方法的api doc的开头)中使用的术语是“监视器”:

  

唤醒在该对象的监视器上等待的单个线程。如果有任何线程在此对象上等待,则选择其中一个唤醒。选择是任意的,并且可以根据实现情况进行选择。线程通过调用其中一个wait方法在对象的监视器上等待。

该操作系统具有一个线程调度程序,该调度程序可以做出javadoc中描述的任意决定,它可以决定何时线程进行上下文切换或通知谁。

因此,当消费中的线程等待时,它将进入休眠状态。然后最终有其他线程(在该示例中,只有两个线程获取pc上的锁)调用在同一对象上通知第一个调用wait的线程,调度程序选择了要通知的线程(这里是第一个线程) (因为没有其他东西在等待),通知线程将唤醒并检查是否有消耗的东西,以便可以知道是否继续。