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。每次线程获得同一个对象的锁时,计数再次增加。
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