为什么在Java的Object类中声明wait()和notify()?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

为什么在课堂上而不是课堂上声明wait()notify()方法?ObjectThread

提问于
用户回答回答于

因为,你在一个给定的对象(或者特定的监视器)上等待使用这个功能。

我想你可能会误解这些方法是如何工作的。它们不仅仅处于线程粒度级别,也就是说,它不是简单地调用wait()并被下一次调用唤醒的情况notify()。相反,你总是调用wait()一个特定的对象,并且只会被notify 该对象的调用唤醒。

这很好,因为否则并发原语不会缩放; 这相当于拥有全局名称空间,因为任何对notify()程序中任何地方的调用都可能会混淆任何并发代码,因为它们会唤醒阻塞在wait()呼叫中的任何线程。因此,你称他们为特定对象的原因; 它为等待通知对操作提供了一个上下文,所以当你调用myBlockingObject.notify()一个私有对象时,你可以确定你只会唤醒在你的类中调用wait方法的线程。一些可能在另一个对象上等待的Spring线程不会被这个调用唤醒,反之亦然。

或者从另一个角度解决这个问题-我从你的问题,你以为你会得到一个处理等待的线程,并呼吁希望notify()该线程将其唤醒。没有这样做的原因是你必须自己做很多家务。要等待的线程必须在其他线程可以看到的地方发布自己的引用; 这必须进行适当的同步以确保一致性和可视性。而当你想唤醒线程时,你必须得到这个参考,唤醒它,并从你阅读的任何地方移除它。涉及到更多的人工脚手架,并且更多机会出错(特别是在并发环境中),而不是仅仅调用myObj.wait()在睡眠线程中,然后myObj.notify()在威克线程中。

用户回答回答于

最简单明显的原因是任何对象(不只是一个线程)都可以作为线程的监视器。在监视器上调用wait和notify。正在运行的线程与显示器进行核对。所以wait和notify方法在Object中而不在Thread中

扫码关注云+社区