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

标签 java multithreading wait notify

为什么 wait()notify() 方法是在 Object 类中声明的,而不是 Thread类?

最佳答案

因为,您要等待给定的对象(或具体来说,它的监视器)才能使用此功能。

我认为您可能误解了这些方法的工作原理。它们不只是处于线程粒度级别,即 不是 只是调用 wait() 并被下一次调用 唤醒的情况通知()。相反,您总是在特定对象上调用 wait(),并且只会通过在该对象上调用 notify 来唤醒。

这很好,否则并发原语将无法扩展;它相当于拥有全局命名空间,因为在程序中的任何位置对 notify() 的任何调用都可能会弄乱 any 并发代码,因为它们会唤醒任何线程阻塞 wait() 调用。因此,您在特定对象上调用它们的原因;它为等待通知对操作提供了上下文,因此当您在私有(private)对象上调用 myBlockingObject.notify() 时,您可以确定您只会唤醒调用过的线程类中的等待方法。某些可能正在等待另一个对象的 Spring 线程不会被此调用唤醒,反之亦然。

编辑:或者从另一个角度解决它 - 我希望从你的问题中你认为你会得到等待线程的句柄并在 那个线程notify() > 唤醒它。不这样做的原因是你必须自己做很多家务。等待的线程必须在其他线程可以看到的地方发布对自身的引用;这必须适本地同步以加强一致性和可见性。当你想唤醒一个线程时,你必须掌握这个引用,唤醒它,然后从你阅读它的任何地方删除它。与仅在 sleep 线程中调用 myObj.wait() 然后 相比,涉及更多的手动脚手架,并且出错的可能性更大(尤其是在并发环境中) myObj.notify() 在唤醒线程中。

关于java - 为什么在 Java 的 Object 类中声明 wait() 和 notify()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1769489/

相关文章:

java - jackson 映射关系

java - 如何在 Java 中设置标签(彩色文本)的颜色?

c# - 后台 worker 异常处理

mysql - 使用mysql查询获取一个月中星期日的所有日子?

c++ - QTcpSocket:消息不是从另一个线程发送的

c - 父进程不等待子进程 - C

java - 将子类对象分配给 Superclass 实例类型只是为了重写概念?还是我们这样做也是为了其他事情?

java - 异常(exception)是 REST Jersey

java - 多线程中线程不使用notify()退出等待状态

java - 启动Firefox并等待其关闭