在阅读有关Java线程的文章时,我经常注意到这样的表达:“当前线程是该对象的监视器的所有者”。我的意思是:线程有权在对象上进行操作。但是我很困惑,为什么我们使用“对象的监视器”而不是“对象的锁”?
简而言之,我不知道“监视”一词的含义。这个问题可能很奇怪而且很简单。但我希望任何人都可以帮助解决它。3ks
Answers:
但是我感到困惑的是为什么要在“对象的锁”中使用“对象的监视器”一词呢?
请参阅ulmangt的答案以获取在此上下文中解释“监视”一词的链接。注意:
“监视器是由Per Brinch Hansen和CAR Hoare发明的,并且首先以Brinch Hansen的并发Pascal语言实现。”
(来源:维基百科)
为什么使用术语“监视器”而不是“锁定”?严格来说,这些术语的含义确实不同……尤其是如果您以最初打算使用的方式使用它们时。
“锁”是指具有获取和释放原语的东西,这些原语和原语保持某些锁属性。例如,独占使用或单作者/多读者。
“监视程序”是一种机制,可确保在任何给定时间只有一个线程可以执行给定代码段。可以使用锁(和“条件变量”,允许线程等待或通知满足条件的其他线程)来实现此功能,但它不仅仅是锁。实际上,在Java情况下,不能直接访问监视器使用的实际锁。(您不能说“ Object.lock()”来阻止其他线程获取它,就像使用JavaLock
实例一样。)
简而言之,如果要学究的话,“ monitor”实际上是比“ lock”更好的术语,用于描述Java提供的特性。但是实际上,这两个术语几乎可以互换使用。
监视器只是一个对象的术语,其方法可以在多线程环境中安全使用。
在Monitors上有一篇很棒的Wikipedia文章:
http://en.wikipedia.org/wiki/Monitor_(同步)
如果您向下滚动,它甚至会明确地包含有关Java的部分。
从Java虚拟机内部引用
Java虚拟机中的线程在到达监视区域的开头时会请求锁定。在Java中,有两种监视区域:同步语句和同步方法。
监控
监视器就像一栋建筑物,其中包含一个特殊的房间,一次只能占用一个线程。房间通常包含一些数据。从线程进入该房间的时间到它离开的时间,它可以独占访问该房间中的任何数据。进入监视器建筑物称为“进入监视器”。进入建筑物内的特殊房间称为“获取监视器”。占用房间称为“拥有监视器”,而离开房间称为“释放监视器”。离开整个建筑物称为“退出监视器”。
除了与一小段数据关联外,一个监视器还与一个或多个代码位关联,在本书中将其称为监视器区域。
如前所述,该语言提供了两种内置的方法来标识程序中的监视区域:同步语句和同步方法。Java虚拟机的指令集支持实现同步的互斥方面的这两种机制。
锁
为了实现监视器的互斥功能,Java虚拟机将锁(有时称为互斥锁)与每个对象和类相关联。锁就像特权,一次只能拥有一个线程。
允许单个线程多次锁定同一对象。对于每个对象,Java虚拟机都会维护对象被锁定的次数。一个未锁定的对象的计数为零。当线程第一次获取锁时,计数再次增加到一个。线程每次在同一对象上获得锁时,计数都会再次增加。
Java虚拟机使用监视器来支持多线程。监视器通过两个概念实现这一点-运行线程时互斥(这里是“锁定”的地方)和作为线程间通信手段的协调(这里是对象的wait和notify方法的地方)。
从“ Inside JVM”中阅读以下部分将清除这个疑问,在这里是否很好解释(第20章,线程同步)-