Java中对象监视器的含义是什么? 为什么要用这个词?
在阅读关于Java线程的文章时,我经常注意到:“当前线程是这个对象监视器的所有者”。 我明白了这个意思:线程有权对对象进行操作。 但是我为什么用“对象的监视器”而不是“对象的locking”这个短语呢?
简而言之,我不知道“监视器”这个词的意思。这个问题可能很奇怪,很简单。 但我希望有人能帮助解决它。 3KS
但是我很困惑为什么用“对象的监视器”来表示“对象的锁”呢?
请参阅ulmangt的解释在本文中使用的术语“监视器”的链接的答案。
为什么使用术语“监视器”而不是“locking”? 严格地说,这些术语确实意味着不同的东西,尤其是如果你按照原来打算使用的方式来使用它们的话。
-
一个“锁”是获取和释放原语,维持某些锁的属性; 如独家使用或单个作家/多个阅读器。
-
“监视器”是一种机制,可确保在任何给定的时间只有一个线程可以执行给定的代码段(或多个段)。 这可以通过使用锁来实现(而“条件variables”允许线程等待或发送通知给条件满足的其他线程),但它不仅仅是一个锁。 事实上,在Java情况下,监视器使用的实际locking不能直接访问。 (你只是不能说“Object.lock()”,以防止其他线程获取它…就像你可以用一个Java
Lock
实例。)
简而言之,如果一个人是迂腐的,那么“监视器”实际上是一个比“locking”更好的表征Java所提供的术语的术语。 但在实践中,这两个术语几乎可以互换使用。
监视器只是一个对象,它的方法可以安全地在multithreading环境中使用。
监视器上有一个伟大的维基百科文章:
http://en.wikipedia.org/wiki/Monitor_(synchronization);
如果向下滚动,它甚至会明确指出Java的一个部分 。
围绕object
synchronized
块是它的监视器,它控制着对象的locking。 这里是一个例子
synchronized (object) { while (<condition does not hold>) object.wait(timeout); ... // Perform action appropriate to condition }
每个对象都有一些内置的监视器,等待它被某些代码使用。 实际上,大多数对象从来不会用作显示器,所以显示器不需要被创build,直到它们被使用。 每个具有私有Monitor监视器字段的对象都不要实现此function,而应该将其视为具有全局HashMap监视器的JVM。
一个可能的实现是这样的:只要input一个同步块,JVM就会在映射(监视器)中查找同步的对象。 如果find它,它会得到监视器使用。 如果没有find,它会进入专门针对地图的关键部分。 然后它再次查找该对象,因为另一个线程可能在之前的检查和进入临界区之间创build了它。 如果它仍然不存在,它将创build同步对象的监视器并离开关键部分
Java虚拟机使用监视器来支持multithreading。 监视器通过两个概念来实现这一点 – 在运行线程(这里是“locking”进入图像的位置)和协调作为线程间通信的手段(这里是对象的等待和通知方法进入图像的位置)时相互排斥。
从“内部JVM”中读取以下部分将清除这个疑问,这里是非常好的解释(第20章,线程同步) –
尽pipe回答这个问题迟到了,但是我认为只要加上它就有用了。
这里是一个非同步Java方法内的Java代码同步块
public void add(int value){ synchronized(this){ this.count += value; } }
在这个例子中使用了“this”,这就是调用add方法的实例。 同步实例方法使用它所属的对象作为监视对象。
=>在同一监视器对象上同步的Java代码块内只能执行一个线程。