Java并发编程中所指的监视器是什么?
当我看到“每个对象都关联了一个监视器”时,这是什么意思?
这是一个特殊的对象吗?
Java并发编程中所指的监视器是什么?
当我看到“每个对象都关联了一个监视器”时,这是什么意思?
这是一个特殊的对象吗?
Answers:
监视器是一种控制并发访问对象的机制。
这使您可以执行以下操作:
线程1:
public void a()
{
synchronized(someObject) {
// do something (1)
}
}
线程2:
public void b()
{
synchronized(someObject) {
// do something else (2)
}
}
这样可以防止线程1和2同时访问受监视(同步)的部分。一个将启动,并且监视器将阻止另一个在第一个完成之前访问该区域。
这不是一个特殊的对象。它的同步机制位于类层次结构的根目录:中java.lang.Object
。
还有wait
和notify
方法也将使用对象的监视器在不同线程之间进行通信。
Class
对于静态方法而言,则对应于对象。如果您已经有一个同步的method1()并声明method2()已同步,则不会创建新的监视器,并且实际上(在同一对象上)调用任何一个方法都将尝试锁定同一监视器。这经常赶上新来者。
监视器是同时具有锁和等待集的实体。在Java中,任何一个Object
都可以充当监视器。
有关监视器如何在Java中工作的详细说明,我建议阅读Java并行编程中的“ 监视器机制”部分(前面的链接显示了Google图书中的预览,该部分可供阅读)。
Wakes up all threads that are waiting on this object's monitor.
notifyall()时,我得到的是对象正在维护(借助内部实体/对象)所有线程都在等待什么锁,该内部实体/对象称为monitor?
Java语言和运行时系统通过使用监视器来支持线程同步。
监视器与特定数据项(条件变量)相关联,并充当该数据的锁。当某个线程为某些数据项保留监视器时,其他线程将被锁定,无法检查或修改数据。
Monitor是一种同步构造,它允许线程具有互斥性,并具有等待(阻止)某个条件变为真的能力。
监视器还具有一种机制,用于向其他线程发出已满足其条件的信号。它是同时具有锁和等待集的实体。在Java中,任何对象都可以充当监视器。
在Java虚拟机中,每个对象和类在逻辑上都与监视器关联。为了实现监视器的互斥功能,将一个锁(有时称为互斥锁)与每个对象和类关联。在操作系统方面,这称为信号量,互斥体是二进制信号量。
http://journals.ecs.soton.ac.uk/java/tutorial/java/threads/monitors.html
Monitor与对象或数据成员相关联,该对象或数据成员在进入数据成员或对象时获取,它是同步块(关键部分),并在退出时释放。