Java中的监视器是什么?


129

Java并发编程中所指的监视器是什么?

当我看到“每个对象都关联了一个监视器”时,这是什么意思?

这是一个特殊的对象吗?


11
+1这使我阅读了如何在JVM级别实现监视器。学到了新的东西
naikus

@naikus我希望与您分享详细信息:)
roottraveller

Answers:


89

监视器是一种控制并发访问对象的机制。

这使您可以执行以下操作:

线程1:

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

线程2:

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

这样可以防止线程1和2同时访问受监视(同步)的部分。一个将启动,并且监视器将阻止另一个在第一个完成之前访问该区域。

这不是一个特殊的对象。它的同步机制位于类层次结构的根目录:中java.lang.Object

还有waitnotify方法也将使用对象的监视器在不同线程之间进行通信。


1
所以可以说,当我们创建一个同步方法时,我们正在对该对象的方法定义一个锁(监视器)吗?
xdevel2000

28
嗯,不完全是。每个对象都会自动具有一个与其关联的监视器(互斥体),而不管其他任何事情。当您声明一个同步方法时,您就是在声明运行时必须在该方法的执行开始之前在对象的监视器上获得锁定(并且必须在控制返回到调用代码之前释放该锁定)。
Andrzej Doyle,2010年

31
@Pablo-没有方法的监视器;监视器仅针对对象存在,对于大多数方法而言,它将是封闭的实例,Class对于静态方法而言,则对应于对象。如果您已经有一个同步的method1()并声明method2()已同步,则不会创建新的监视器,并且实际上(在同一对象上)调用任何一个方法都将尝试锁定同一监视器。这经常赶上新来者。
Andrzej Doyle,2010年

1
@Andrzej:因此,每个对象都有一个与之关联的监视器。然后,我可以有许多同步方法。在该方法的任何时候调用线程后,它都会获取执行同步工作的监视器。
xdevel2000

1
只是需要澄清一下...用于调用线程1中的同步块的对象是否可以在另一个线程(线程2)中再次使用,以同时调用普通方法(未同步)?

26

监视器是同时具有等待集的实体。在Java中,任何一个Object都可以充当监视器。

有关监视器如何在Java中工作的详细说明,我建议阅读Java并行编程中的“ 监视器机制”部分(前面的链接显示了Google图书中的预览,该部分可供阅读)。


正如您所说的“监视器是一个实体..”,这是否意味着监视器是一个拥有/跟踪锁和等待集的内部对象/状态?如果不是,您可以在这里详细说明Entity吗?基本上,当我们的Java文档说到Wakes up all threads that are waiting on this object's monitor. notifyall()时,我得到的是对象正在维护(借助内部实体/对象)所有线程都在等待什么锁,该内部实体/对象称为monitor?
user3198603

最有用的答案。谢谢@JRL。
–gravtii

对我来说,它说:“此页面无预览。”
opncow

9
  1. 监视器是一种概念/机制,不仅仅限于Java语言。
  2. “在并发编程中,监视器是旨在由多个线程安全使用的对象或模块”;
  3. 每个读者都知道,Java中的每个对象都是java.lang.Object的子类。Java人员以这样的方式制作java.lang.Object,使其具有使Java程序员可以将任何对象用作监视器的特性。例如,每个对象都有一个等待队列,一个重新进入队列以及等待和通知方法,使其成为监视器。
  4. 在这里阅读有关监视器的信息

4

Java语言和运行时系统通过使用监视器来支持线程同步。
监视器与特定数据项(条件变量)相关联,并充当该数据的锁。当某个线程为某些数据项保留监视器时,其他线程将被锁定,无法检查或修改数据。



2

Monitor是一种同步构造,它允许线程具有互斥性,并具有等待(阻止)某个条件变为真的能力。

监视器还具有一种机制,用于向其他线程发出已满足其条件的信号。它是同时具有锁和等待集的实体。在Java中,任何对象都可以充当监视器。

在Java虚拟机中,每个对象和类在逻辑上都与监视器关联。为了实现监视器的互斥功能,将一个锁(有时称为互斥锁)与每个对象和类关联。在操作系统方面,这称为信号量,互斥体是二进制信号量。

有关更多信息,请查看链接


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.