Java中对象监视器的含义是什么?为什么用这个词?

jia*_*afu 79 java multithreading monitor

在阅读有关Java线程的文章时,我经常注意到这样的表达:"当前线程是该对象监视器的所有者".我明白了:线程有权对对象进行操作.但我很困惑为什么我们使用短语"对象的监视器"而不是"对象的锁"?

简而言之,我不知道"监视器"这个词的含义.这个问题可能很奇怪而且很简单.但我希望任何人都可以帮助解决它.3KS

Ste*_*n C 48

但我很困惑为什么用"对象的监视器"这个词来"对象的锁"?

有关解释在此上下文中使用的术语"监视器"的链接,请参阅ulmangt的答案.

为什么使用术语"监视器"而不是"锁定"?严格地说,这些术语确实意味着不同的东西......特别是如果你按照原本打算使用它们的方式使用它们.

  • "锁定"是具有维持某些锁定属性的获取和释放原语的东西; 例如独家使用或单一作家/多读者.

  • "监视器"是一种机制,可确保在任何给定时间只有一个线程可以执行代码的给定部分(或多个部分).这可以使用一个锁(以及"条件变量"来实现,这些变量允许线程等待或向其他线程发送通知以满足条件),但它不仅仅是一个锁.实际上,在Java情况下,监视器使用的实际锁定不能直接访问.(你不能说"Object.lock()"来阻止其他线程获取它......就像你可以使用Java Lock实例一样.)

简而言之,如果一个人是迂腐的"监视器"实际上是一个比"锁定"更好的术语来表征Java提供的东西.但在实践中,这两个术语几乎可以互换使用.


ulm*_*ngt 22

监视器只是对象的术语,其方法可以安全地用于多线程环境中.

关于监视器的维基百科文章很棒:

http://en.wikipedia.org/wiki/Monitor_(synchronization)

如果向下滚动,它甚至会明确地提供有关Java部分.


Zan*_* XY 14

引用自Java 虚拟机内部

Java 虚拟机中的线程在到达监视区域的开头时请求锁定。在 Java 中,有两种监视区域:同步语句和同步方法。

监视器

监视器就像一座建筑物,里面有一个特殊的房间,一次只能被一个线程占用。房间通常包含一些数据。从一个线程进入这个房间到它离开的时间,它可以独占访问房间中的任何数据。进入监控楼叫“进入监控”。进入建筑物内的特殊房间称为“获取监视器”。占据房间叫“拥有显示器”,离开房间叫“释放显示器”。离开整栋楼叫做“退出监控”。

除了与一位数据相关联之外,监视器还与一位或多位代码相关联,在本书中将其称为监视器区域。

如前所述,该语言提供了两种内置方法来标识程序中的监视区域:同步语句和同步方法。Java 虚拟机的指令集支持这两种机制,它们实现了同步的互斥方面。

为了实现监视器的互斥能力,Java 虚拟机为每个对象和类关联一个锁(有时称为互斥锁)。锁就像一种特权,在任何时候都只有一个线程可以“拥有”。

允许单个线程多次锁定同一个对象。对于每个对象,Java 虚拟机维护一个对象被锁定的次数的计数。解锁对象的计数为零。当线程第一次获得锁时,计数再次增加到 1。每次线程获得同一个对象的锁时,计数再次增加。


abb*_*bas 5

synchronized围绕a的一个块object是它的监视器,它控制对象的锁定.这是一个例子

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}
Run Code Online (Sandbox Code Playgroud)


小智 5

Java虚拟机使用监视器来支持多线程。监视器通过两个概念来实现这一点 - 运行线程时的互斥(这里是“锁定”出现的地方)和作为线程间通信手段的协调(这里是对象的等待和通知方法出现的地方)。

阅读“Inside JVM”中的以下部分将消除这个疑问,这里解释得很好吗(第 20 章,线程同步) -

https://www.artima.com/insidejvm/ed2/threadsynchP.html