Java 中的对象监视器指什么?为什么使用这个词?

99
阅读有关Java线程的文章时,我经常注意到表达式:“当前线程是此对象监视器的所有者”。我理解其意思:线程获得操作该对象的权限。但我不明白为什么我们使用“对象的监视器”而不是“对象的锁”的短语?
简而言之,我不知道“monitor”一词的含义。 这个问题可能奇怪又简单,但我希望有人能帮助解决它。3ks

1
+1 @ulmangt 因为他是唯一一个实际回答你问题的人:我们称它们为“监视器”,因为这正是 Hoare 在 1974 年所称呼的。 - Solomon Slow
6个回答

57
但我困惑的是为什么要使用“对象的监视器”而不是“对象的锁”?
请参阅ulmangt的答案,了解在此上下文中使用术语“monitor”的含义。 请注意:
“监视器是由Per Brinch Hansen和C.A.R. Hoare发明的,并且最初是在Brinch Hansen的Concurrent Pascal语言中实现的。”
(来源:维基百科
为什么要使用术语“monitor”而不是“lock”? 严格来说,这些术语确实有不同的含义...特别是如果您按照它们最初预期的方式使用它们的话。
  • “锁”是具有获取和释放原语的东西,可以维护某些锁属性;例如独占使用或单个写者/多个读者。

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

简而言之,如果要严谨,“监视器”实际上比“锁”更好地描述了Java提供的内容。但实际上,两个术语几乎可以互换使用。


23

20

摘自Java虚拟机内部

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

监视器

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

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

正如前面提到的,语言提供了两种内置方式来识别程序中的监视器区域:同步语句和同步方法。这两种机制实现了同步的互斥方面,并由Java虚拟机支持。

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

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

注:原文中的"Java virtual machine"已翻译成"Java虚拟机"。

7

synchronized块包围着一个object,这个object就是它的监视器,用来控制对该对象的锁定。以下是一个示例:

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

5
Java虚拟机使用监视器来支持多线程。监视器通过两个概念实现这一点:在运行线程时互斥(这就是“锁定”产生作用的地方),以及协调作为线程间通信手段(对象的wait和notify方法产生作用的地方)。
阅读以下来自“JVM内部”的部分将消除这种疑惑,它在这里非常好地解释了(第20章,线程同步)。

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


4
尽管回答这个问题有些晚了,但我认为如果有用的话,还是要补充一下。以下是一个未同步Java方法中的同步块代码:
public void add(int value){
synchronized(this){
      this.count += value;
   }
}

在这个例子中,“this”被使用,它是调用add方法的实例。一个同步的实例方法使用它所属的对象作为监视对象。
=> 只有一个线程可以在同步于相同监视对象的Java代码块内执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接