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


86

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

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


1
+1 @ulmangt是唯一实际回答您的问题的人:我们称它们为“显示器”,因为那是Hoare在1974
Solomon Slow

Answers:


51

但是我感到困惑的是为什么要在“对象的锁”中使用“对象的监视器”一词呢?

请参阅ulmangt的答案以获取在此上下文中解释“监视”一词的链接。注意:

“监视器是由Per Brinch Hansen和CAR Hoare发明的,并且首先以Brinch Hansen的并发Pascal语言实现。”

(来源:维基百科

为什么使用术语“监视器”而不是“锁定”?严格来说,这些术语的含义确实不同……尤其是如果您以最初打算使用的方式使用它们时。

  • “锁”是指具有获取和释放原语的东西,这些原语和原语保持某些锁属性。例如,独占使用或单作者/多读者。

  • “监视程序”是一种机制,可确保在任何给定时间只有一个线程可以执行给定代码段。可以使用锁(和“条件变量”,允许线程等待或通知满足条件的其他线程)来实现此功能,但它不仅仅是锁。实际上,在Java情况下,不能直接访问监视器使用的实际锁。(您不能说“ Object.lock()”来阻止其他线程获取它,就像使用JavaLock实例一样。)

简而言之,如果要学究的话,“ monitor”实际上是比“ lock”更好的术语,用于描述Java提供的特性。但是实际上,这两个术语几乎可以互换使用。



9

Java虚拟机内部引用

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

监控

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

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

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

为了实现监视器的互斥功能,Java虚拟机将锁(有时称为互斥锁)与每个对象和类相关联。锁就像特权,一次只能拥有一个线程。

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


6

监视器synchronized周围object是一个块,该监视器控制对象上的锁定。这是一个例子

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

4

尽管现在回答这个问题已经很晚了,但我还是想补充一下,以防万一。
这是未同步的Java方法中的Java代码的同步块

public void add(int value){
synchronized(this){
      this.count += value;
   }
}

在示例中,使用了“ this”,这是调用add方法的实例。同步实例方法将其所属的对象用作监视对象。
=>在同一监视对象上同步的Java代码块内只能执行一个线程。


3

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

从“ Inside JVM”中阅读以下部分将清除这个疑问,在这里是否很好解释(第20章,线程同步)-

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.