用于区分Java编程语言监视器和等待/通知监视器的术语

时间:2011-05-05 10:09:06

标签: java concurrency monitor

我遇到了Java监视器条款的问题。首先,我区分了两种显示器:

  • 可以使用wait()
  • 获得的人
  • 可以通过synchronized
  • 获得的人

监视器本身是一个对象,在其上调用wait()synchronized。如何区分这两种类型的显示器?在他们写的JVMTI API中:

  

“monitor”表示Java编程语言对象监视器。

这对我没有帮助。但是,他们进一步使用术语监视器和争用监视器来区分它们至少在API中的函数调用。

3 个答案:

答案 0 :(得分:3)

从根本上说,这些都是一回事。它们被称为监视器互斥体和(在Java中)原始锁,这些术语在当前使用中意味着几乎相同。< / p>

涉及带有调用wait()notify()的线程的互斥锁的主要使用模式称为条件,但同一个互斥锁可以同时用作简单区域相互排斥。

短语“争用监视器”是指监视器/互斥锁/原语锁定,其中存在对互斥区域的争用。或者更简单地说,一个线程持有互斥锁,其他线程等待获取它。

维基百科参考:

(应该注意的是,这些页面并不是确定的,并且不完全一致。但是大多数IT人员用术语“快速而宽松”地玩,并且很少有人阅读过原始出版物。但是嘿......那是语言是如何演变的。)

答案 1 :(得分:1)

他们都是一回事。 “监视器”提供两种功能。请注意,synchronized块的VM指令称为monitorentermonitorexit

monitorenter上可能会发生争用(即进入synchronized阻止)或wait(当它唤醒时会尝试重新获取锁定。)

相比之下,Lock的{​​{1}}和Condition接口显示为单独的对象。它们的行为类似于监视器(java.util.concurrent重新获取锁定,可能需要与另一个线程的Condition.await()竞争。)

答案 2 :(得分:1)

您可以 使用wait()获取监视器。恰恰相反:您首先必须使用synchronized 获取显示器,然后才能使用wait(),否则您将获得IllegalMonitorStateException

所以你描述的区别不存在。