多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?
在阅读有关Java线程的文章时,我经常注意到这样的表达:“当前线程是该对象的监视器的所有者”。 我的意思是:线程有权在对象上进行操作。 但是我很困惑,为什么我们使用“对象的监视器”而不是“对象的锁”?
简而言之,我不知道“监控”一词的含义这个问题可能很奇怪而且很简单。 但我希望任何人都能帮助解决它。3KS
6个解决方案
44 votes
但是我很困惑,为什么要使用“对象的监视器”一词而不是“对象的锁”?
请参阅ulmangt的答案以获取在此上下文中解释“监视”一词的链接。
为什么使用术语“监视”而不是“锁定”? 严格来说,这些术语的含义确实有所不同……尤其是如果您以最初打算使用的方式使用它们。
“锁”是指具有获取和释放原语的东西,这些原语和原语保持某些锁属性。 例如 专用或单作者/多读者。
“监视程序”是一种机制,可确保在任何给定时间只有一个线程可以执行给定的代码段。 可以使用锁(和“条件变量”,允许线程等待或通知满足条件的其他线程)来实现此功能,但它不仅仅是锁。 实际上,在Java情况下,不能直接访问监视器使用的实际锁。 (您不能说“ Object.lock()”来阻止其他线程获取它,就像使用Java Lock实例一样。)
简而言之,如果要学究的话,“ monitor”实际上是比“ lock”更好的术语,用于描述Java提供的特性。 但是实际上,这两个术语几乎可以互换使用。
Stephen C answered 2019-09-24T08:12:08Z
20 votes
监视器只是一个对象的术语,其方法可以在多线程环境中安全使用。
在Monitors上有一篇很棒的Wikipedia文章:
[http://en.wikipedia.org/wiki/Monitor_(synchronization)]
如果向下滚动,甚至还会有专门关于Java的部分。
ulmangt answered 2019-09-24T08:12:54Z
5 votes
它的监视器是object周围的synchronized块,它控制对象上的锁定。 这是一个例子
synchronized (object) {
while ()
object.wait(timeout);
... // Perform action appropriate to condition
}
abbas answered 2019-09-24T08:13:20Z
4 votes
尽管现在回答这个问题已经很晚了,但我还是想补充一下,以防万一。
这是未同步的Java方法中的Java代码的同步块
public void add(int value){
synchronized(this){
this.count += value;
}
}
在示例“ this”中,使用了add方法。同步实例方法将其所属的对象用作监视对象。
=>在同一监视对象上同步的Java代码块内只能执行一个线程。
aman answered 2019-09-24T08:14:13Z
2 votes
Java虚拟机使用监视器来支持多线程。 监视器通过两个概念实现这一点-运行线程时互斥(这里是“锁定”的地方)和作为线程间通信手段的协调(这里是对象的wait和notify方法的地方)。
从“ Inside JVM”中阅读以下部分将清除这个疑问,在这里是否很好解释(第20章,线程同步)-
[https://www.artima.com/insidejvm/ed2/threadsynchP.html]
adityalad answered 2019-09-24T08:14:53Z
2 votes
从Java虚拟机内部引用
Java虚拟机中的线程在到达时请求锁定 在监视区域的开头。 在Java中,有两种 监视区域:同步语句和同步方法。
监控
监视器就像一栋建筑物,其中包含一个可以 一次只能被一个线程占用。 房间通常包含 一些数据。 从线程进入这个房间的时间到它进入的时间 离开后,它可以独占访问房间中的任何数据。 进入 监视程序的建立称为“进入监视程序”。 进入 建筑物内的特殊房间称为“获取显示器”。 占领房间称为“拥有显示器”,然后离开房间 房间被称为“释放显示器”。 离开整个建筑是 称为“退出监视器”。
监视器除了与少量数据相关联之外, 与一个或多个代码位相关联,在本书中 称为监视区域。
如前所述,该语言提供了两种内置方法 识别程序中的监视区域:同步语句和 同步方法。 这两种机制,实现了相互 Java虚拟机支持同步的排除方面 机器的指令集。
锁
为了实现监视器的互斥功能,Java 虚拟机将锁(有时称为互斥锁)与每个 对象和类。 锁就像特权,只有一个线程可以 随时“拥有”。
允许单个线程多次锁定同一对象。 对于 每个对象,Java虚拟机都会维护一个数量的计数 对象被锁定的次数。 解锁对象的数量为 零。 当线程首次获取锁时,计数为 再次增加到一。 每次线程获得对 同一对象,计数再次增加。
Zane XY answered 2019-09-24T08:16:16Z