在 Java 中,Object
和 Thread
是独立的类。尽管我们有 Object
/Thread
方法,但 Java wait()
源代码没有提到任何关于 monitor/notify()
的内容。
所以问题是 Object
的监视器如何知道获取它的线程的详细信息?这些信息存储在哪里?对象和线程是如何链接的?
最佳答案
一般来说,这取决于实现。Object
和 Thread
的 Java 代码只做相当肤浅的事情。但真正的工作是通过本地方法完成的。
Java 语言规范指定了对象监视器及其等待集的行为方式,但并未指定将如何实现。
此外,尽管 Java 虚拟机具有 monitorenter
和 monitorexit
命令,但 JVM 规范说:
这一切都归结为一件事:对象的具体实现方式、 header 中的内容、监控器的实现方式以及 wait()
和 notify()
方法的实现方式完全取决于编写特定 JVM 的程序员。 Oracle(继承自Sun)的实现可能与IBM 或IcedTea 的实现完全不同。
此外,即使对于同一个编程团队,JVM 可用的各种操作系统之间的实现细节也不同。这样做的原因很明显:JVM 依赖操作系统的线程机制来实现其线程,并且每个操作系统以非常不同的方式提供对线程的访问。
因此,为 Windows 编写线程实现的程序员与为 Linux 或 MacOS X 编写线程实现的程序员做的事情非常不同。线程可能以不同的方式锁定,因此操作系统之间的监视器可能完全不同。
总结:
关于java - 对象如何与线程链接,因此 wait() 和 notify() 工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29579539/