为了账号安全,请及时绑定邮箱和手机立即绑定

调用 wait() 方法时发生了什么

调用 wait() 方法时发生了什么

达令说 2022-06-15 15:15:19
我在 Java 教科书中阅读了以下与多线程有关的内容。对于调用 wait() 或 notify() 的线程,该线程必须是该对象的锁的所有者。当线程等待时,它会暂时释放锁以供其他线程使用,但它会再次需要它来继续执行。我对条款的含义感到困惑当线程等待时,它会暂时释放锁以供其他线程使用我不明白那个条款在说什么。是说当wait()方法被调用时,它实际上是在wait()返回之前释放锁(即这发生在调用者不知道的情况下)?或者它只是暗示wait(timeout)在超时时间过去时释放锁?如果是前者,为什么要先释放锁notify()?这似乎是一个模糊且解释不清的陈述。
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

对于调用 wait() 或 notify() 的线程,该线程必须是该对象的锁的所有者。

否则,会发生运行时错误,并且不会执行其余代码。

当线程等待时,它会暂时释放锁以供其他线程使用

更详细地说,调用wait()会执行以下操作:

  • 锁被释放

  • 当前线程在监视器中注册为等待

  • 处理器切换到其他准备执行的线程

然后,一些线程调用notify()notifyAll(),这会导致在此监视器上注册为等待的一个或所有线程从等待集移动到就绪集,等待空闲处理器执行。

但它会再次需要它来继续执行。

这意味着线程的执行将继续执行同步语句以重新获得锁定。获得锁后,wait()方法返回。wait(timeout)的不同之处在于,除了notify()notifyAll()之外,它还可以在超时时返回。

总之,您需要了解线程如何在以下 4 种状态之间切换:

  • 在处理器上运行

  • 在同步语句上阻塞

  • 等待通知

  • 准备执行并等待空闲处理器


查看完整回答
反对 回复 2022-06-15
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

当一个线程调用wait()时,它会暂时释放对象的监视器(锁),直到它收到另一个线程的通知。这样,一个线程可以心甘情愿地将对象监视器的控制权(它首先拥有的)交给另一个线程。看看文档

在另一个线程发出可能发生某些特殊事件的通知之前,调用wait()不会返回——尽管不一定是该线程正在等待的事件(因此始终wait()在测试等待条件的循环内调用)。

...

wait()被调用时,线程释放锁并暂停执行。在未来某个时间,另一个线程将获取相同的锁并调用 Object.notifyAll,通知所有等待该锁的线程发生了重要的事情。


查看完整回答
反对 回复 2022-06-15
?
Qyouu

TA贡献1786条经验 获得超11个赞

当一个线程调用 wait 时,该线程立即释放锁,然后进入休眠状态,直到超时到期(如果有),或者直到它收到通知,当另一个线程获得等待线程放弃并调用的相同锁时,就会发生这种情况通知它(调度程序也必须从任何其他等待线程中选择等待线程;调用通知不会通知给定线程,它告诉调度程序从给定锁的等待集中选择一个线程来通知)。

一旦线程被通知唤醒,它必须重新获得锁才能离开等待方法,因为线程仍然在同步方法或块内。这就是引用的意思,当它说线程需要锁才能恢复执行时。


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信