简而言之,我不知道“monitor”一词的含义。 这个问题可能奇怪又简单,但我希望有人能帮助解决它。3ks
“锁”是具有获取和释放原语的东西,可以维护某些锁属性;例如独占使用或单个写者/多个读者。
“监视器”是一种机制,确保在任何给定时间只有一个线程可以执行给定代码段(或代码段)。这可以使用锁(以及“条件变量”,允许线程等待或发送通知给其他线程,表明条件已满足)来实现,但它不仅仅是锁。实际上,在Java情况下,监视器使用的实际锁不是直接可访问的。 (您无法像使用Java Lock
实例那样说“Object.lock()”以防止其他线程获取它。)
简而言之,如果要严谨,“监视器”实际上比“锁”更好地描述了Java提供的内容。但实际上,两个术语几乎可以互换使用。
监视器是指那些在多线程环境中可以安全使用方法的对象。
维基百科上有一篇很好的关于监视器的文章:
http://en.wikipedia.org/wiki/Monitor_(synchronization)
如果您向下滚动,它甚至还有一个专门讲解Java的部分。
当一个线程到达监视器区域的开头时,它会在Java虚拟机中请求锁。在Java中,有两种类型的监视器区域:同步语句和同步方法。
监视器
监视器就像是一个建筑物,其中包含一个特殊的房间,一次只能由一个线程占用。这个房间通常包含一些数据。从一个线程进入这个房间到离开之间,它可以独占房间中的任何数据。进入监视器建筑物被称为“进入监视器”。进入建筑物里面的特殊房间被称为“获取监视器”。占据房间被称为“拥有监视器”,离开房间被称为“释放监视器”。离开整个建筑物被称为“退出监视器”。
除了与一些数据相关联外,监视器还与一些代码位相关联,在本书中称为监视器区域。
正如前面提到的,语言提供了两种内置方式来识别程序中的监视器区域:同步语句和同步方法。这两种机制实现了同步的互斥方面,并由Java虚拟机支持。
锁
注:原文中的"Java virtual machine"已翻译成"Java虚拟机"。为了实现监视器的互斥能力,Java虚拟机为每个对象和类关联一个锁(有时称为互斥量)。锁就像是只有一个线程可以在任何时候“拥有”的特权。
单个线程允许多次锁定同一对象。对于每个对象,Java虚拟机维护一个被锁定的次数计数器。未锁定的对象计数为零。当线程第一次获取锁时,计数器再次递增到一。每次线程在相同对象上获取锁时,计数器再次递增。
synchronized
块包围着一个object
,这个object
就是它的监视器,用来控制对该对象的锁定。以下是一个示例:
synchronized (object) {
while (<condition does not hold>)
object.wait(timeout);
... // Perform action appropriate to condition
}
public void add(int value){
synchronized(this){
this.count += value;
}
}