java线程中的“监视器”
我已经阅读了不同的博客中关于监视器的不同的东西。所以现在有点困惑。java线程中的“监视器”
据我所知,monitor是一个确保只有一个线程在关键部分执行代码的人。因此,如果我们有3个同步的方法/块,那么我们将有3个监视器来确保只有一个线程在关键部分。
如果以上情况属实,那么为什么说Java中的每个对象都有一个与之关联的监视器。它应该是每个同步块都与监视器关联。
什么是监视器?
监视器是一个线程可以抓住并保持的东西,防止所有其他线程抓住同一个监视器并迫使它们等待,直到监视器被释放。这是块的功能。
这些显示器来自哪里?
答案是:从任何Java对象。当你写:
Object foo = new Object();
synchronized (foo) {
System.out.println("Hello world.");
}
...这是什么意思是:当前线程会先抢存储在变量foo
对象相关联的监视并保持它,而它输出“Hello World”,然后将其释放。
为什么每个Java对象都有一个与之关联的监视器?
没有技术上的理由。这是一个在Java早期版本中做出的设计决定,现在改变已经太迟了(尽管它最初令人困惑,而且如果人们不小心会造成问题)。
那么在同步方法的情况下会发生什么,我们没有与它关联的对象,所以没有使用监视器? –
@DeepakKumar一个'synchronized'方法od等同于'synchronized(this){}',而静态同步方法使用类对象作为其监视器。 – biziclop
感谢您的回复。如果我问了这么多问题,我还有最后一件事,并且很抱歉。如果我没有弄错,静态同步方法与类对象无关。那么在这种情况下,我们如何能够将类对象作为监视器? –
使用带有块的时,指定要锁定的对象。在这种情况下,该对象的监视器用于锁定。
将与方法一起使用时,您不指定要锁定的对象,而是隐含this
对象。再次,this
的监视器用于锁定。
因此,对象具有监视器,同步方法/块没有自己的监视器,而是使用特定对象的监视器。
是的,但是每个同步块都有一个与之相关联的监视器(通过'synchronized(monitor){...}'声明,并且该监视器是一个对象 –
所以你说monitor只不过是共享资源我们正在尝试访问? –
您可以将monitor作为对象的一部分,它可以记住哪个线程当前正在执行同步的块,还可以记住线程进入同步块的次数(基于同一个监视器) -entrant lock)监视器还记得当前正在等待的其他线程的列表,以通知它们应该继续它们的代码 – Pshemo