在 Java 中,ObjectThread 是独立的类。尽管我们有 Object/Thread 方法,但 Java wait() 源代码没有提到任何关于 monitor/notify() 的内容。

所以问题是 Object 的监视器如何知道获取它的线程的详细信息?这些信息存储在哪里?对象和线程是如何链接的?

最佳答案

一般来说,这取决于实现。
ObjectThread 的 Java 代码只做相当肤浅的事情。但真正的工作是通过本地方法完成的。

Java 语言规范指定了对象监视器及其等待集的行为方式,但并未指定将如何实现。

此外,尽管 Java 虚拟机具有 monitorentermonitorexit 命令,但 JVM 规范说:



这一切都归结为一件事:对象的具体实现方式、 header 中的内容、监控器的实现方式以及 wait()notify() 方法的实现方式完全取决于编写特定 JVM 的程序员。 Oracle(继承自Sun)的实现可能与IBM 或IcedTea 的实现完全不同。

此外,即使对于同一个编程团队,JVM 可用的各种操作系统之间的实现细节也不同。这样做的原因很明显:JVM 依赖操作系统的线程机制来实现其线程,并且每个操作系统以非常不同的方式提供对线程的访问。

因此,为 Windows 编写线程实现的程序员与为 Linux 或 MacOS X 编写线程实现的程序员做的事情非常不同。线程可能以不同的方式锁定,因此操作系统之间的监视器可能完全不同。

总结:

  • Java 语言规范中定义了对象的监视器和该监视器的等待集的行为方式。
  • 线程管理依赖于操作系统。因此,它必须在 native 级别实现,而不是在 Java 语言本身中实现。
  • 持有监视器所需的数据结构、持有它的当前线程、等待集等也都在 native 级别,并且可能因操作系统和JVM 实现而异。
  • Oracle 在自己的 JVM 中实现所有这些的方式不一定是唯一正确的方式,并且所有其他实现都遵循这种方式。
  • 关于java - 对象如何与线程链接,因此 wait() 和 notify() 工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29579539/

    10-11 22:51
    查看更多