【问题标题】:What's the meaning of an object's monitor in Java? Why use this word?Java中对象的监视器是什么意思?为什么要用这个词?
【发布时间】:2012-03-24 02:23:03
【问题描述】:

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

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

【问题讨论】:

  • +1 @ulmangt 是唯一真正回答您问题的人:我们称它们为“监视器”,因为这就是 Hoare 在 1974 年所说的。

标签: java multithreading monitor


【解决方案1】:

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

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

“监视器是由 Per Brinch Hansen 和 C. A. R. Hoare 发明的,最初是用 Brinch Hansen 的并发 Pascal 语言实现的。”

(来源:Wikipedia

为什么使用术语“监控”而不是“锁定”?严格来说,这些术语确实有不同的含义……尤其是如果您按照最初的预期使用方式使用它们。

  • “锁”是一种具有获取和释放原语的东西,可维护某些锁属性;例如独占使用或单个作者/多个阅读器。

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

简而言之,如果要学究气的话,“监视器”实际上是一个比“锁”更好的术语来描述 Java 所提供的特性。但在实践中,这两个术语几乎可以互换使用。

【讨论】:

    【解决方案2】:

    监视器只是一个对象的术语,其方法可以在多线程环境中安全使用。

    维基百科上有一篇很棒的关于监视器的文章:

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

    如果你向下滚动,它甚至有一个section explicitly about Java

    【讨论】:

      【解决方案3】:

      引用Inside the Java Virtual Machine

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

      监控

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

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

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

      锁定

      为了实现监视器的互斥能力,Java 虚拟机将锁(有时称为互斥锁)与每个 对象和类。锁就像只有一个线程可以拥有的特权 随时“拥有”。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          即使回答这个问题已经很晚了,我还是想补充一下,以防万一它有用。
          这是一个非同步 Java 方法中的同步 Java 代码块

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

          在示例中使用了“this”,即调用 add 方法的实例。 同步实例方法使用它所属的对象作为监控对象。
          => 只有一个线程可以在同一个监视器对象上同步的 Java 代码块内执行。

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              猜你喜欢
              • 2018-10-29
              • 2010-10-03
              • 1970-01-01
              • 1970-01-01
              • 2011-01-07
              • 2019-12-22
              • 1970-01-01
              • 1970-01-01
              • 2010-11-10
              相关资源
              最近更新 更多