如何将Object与Thread链接,以便wait()和notify()工作

Him*_*ire 3 java multithreading

在Java中Object,它Thread是独立的类.Java Object源代码没有提到有关monitor /的任何内容,Thread尽管我们有wait()/ notify()methods.

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

Rea*_*tic 7

一般来说,这是依赖于实现的.

同时为Java代码ObjectThread只做相当肤浅的东西.但真正的工作是通过本地方法完成的.

Java语言规范指定了对象监视器及其等待集应该如何表现,但它没有指定如何实现它.

此外,虽然Java虚拟机的命令monitorentermonitorexit,JVM规范,说:

可以以超出本说明书范围的各种方式管理监视器与对象的关联.例如,可以与对象同时分配和释放监视器.或者,它可以在线程试图获得对对象的独占访问时被动态地分配,并且在稍后没有线程保留在对象的监视器中时释放.

除了进入和退出之外,Java编程语言的同步构造还需要支持监视器上的操作.这些包括等待监视器(Object.wait)并通知在监视器上等待的其他线程(Object.notifyAllObject.notify).java.langJava虚拟机随附的标准软件包支持这些操作.Java虚拟机的指令集中不显示对这些操作的明确支持

这一件事情的全部款项:究竟如何对象实现,什么是在它的头,它的显示器是如何实现的,以及如何wait()notify()方法实现都完全取决于谁写的特定JVM的程序员.Oracle(继承自Sun)的实现可能与IBM或IcedTea的实现完全不同.

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

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

总结一下:

  • 对象的监视器和该监视器的等待集的行为方式在Java语言规范中定义.
  • 线程管理依赖于操作系统.因此,它必须在本机级别实现,而不是在Java语言本身中实现.
  • 保存监视器,保存监视器所需的数据结构,等待集等等也都在本机级别,并且在操作系统之间和JVM实现之间可能不同.
  • Oracle在其自己的JVM中实现所有这些的方式并不一定是唯一正确的方式,其次是所有其他实现.