java线程中的“监视器”

java线程中的“监视器”

问题描述:

我已经阅读了不同的博客中关于监视器的不同的东西。所以现在有点困惑。java线程中的“监视器”

据我所知,monitor是一个确保只有一个线程在关键部分执行代码的人。因此,如果我们有3个同步的方法/块,那么我们将有3个监视器来确保只有一个线程在关键部分。

如果以上情况属实,那么为什么说Java中的每个对象都有一个与之关联的监视器。它应该是每个同步块都与监视器关联。

+2

是的,但是每个同步块都有一个与之相关联的监视器(通过'synchronized(monitor){...}'声明,并且该监视器是一个对象 –

+0

所以你说monitor只不过是共享资源我们正在尝试访问? –

+1

您可以将monitor作为对象的一部分,它可以记住哪个线程当前正在执行同步的块,还可以记住线程进入同步块的次数(基于同一个监视器) -entrant lock)监视器还记得当前正在等待的其他线程的列表,以通知它们应该继续它们的代码 – Pshemo

什么是监视器?

监视器是一个线程可以抓住并保持的东西,防止所有其他线程抓住同一个监视器并迫使它们等待,直到监视器被释放。这是​​块的功能。

这些显示器来自哪里?

答案是:从任何Java对象。当你写:

Object foo = new Object(); 
synchronized (foo) { 
    System.out.println("Hello world."); 
} 

...这是什么意思是:当前线程会先抢存储在变量foo对象相关联的监视并保持它,而它输出“Hello World”,然后将其释放。

为什么每个Java对象都有一个与之关联的监视器?

没有技术上的理由。这是一个在Java早期版本中做出的设计决定,现在改变已经太迟了(尽管它最初令人困惑,而且如果人们不小心会造成问题)。

+0

那么在同步方法的情况下会发生什么,我们没有与它关联的对象,所以没有使用监视器? –

+1

@DeepakKumar一个'synchronized'方法od等同于'synchronized(this){}',而静态同步方法使用类对象作为其监视器。 – biziclop

+0

感谢您的回复。如果我问了这么多问题,我还有最后一件事,并且很抱歉。如果我没有弄错,静态同步方法与类对象无关。那么在这种情况下,我们如何能够将类对象作为监视器? –

使用带有块的​​时,指定要锁定的对象。在这种情况下,该对象的监视器用于锁定。

将​​与方法一起使用时,您不指定要锁定的对象,而是隐含this对象。再次,this的监视器用于锁定。

因此,对象具有监视器,同步方法/块没有自己的监视器,而是使用特定对象的监视器。