我遇到了Java监视器条款的问题。首先,我区分了两种显示器:
wait()
synchronized
块 监视器本身是一个对象,在其上调用wait()
或synchronized
。如何区分这两种类型的显示器?在他们写的JVMTI API中:
“monitor”表示Java编程语言对象监视器。
这对我没有帮助。但是,他们进一步使用术语监视器和争用监视器来区分它们至少在API中的函数调用。
答案 0 :(得分:3)
从根本上说,这些都是一回事。它们被称为监视器,互斥体和(在Java中)原始锁,这些术语在当前使用中意味着几乎相同。< / p>
涉及带有调用wait()
和notify()
的线程的互斥锁的主要使用模式称为条件,但同一个互斥锁可以同时用作简单区域相互排斥。
短语“争用监视器”是指监视器/互斥锁/原语锁定,其中存在对互斥区域的争用。或者更简单地说,一个线程持有互斥锁,其他线程等待获取它。
维基百科参考:
(应该注意的是,这些页面并不是确定的,并且不完全一致。但是大多数IT人员用术语“快速而宽松”地玩,并且很少有人阅读过原始出版物。但是嘿......那是语言是如何演变的。)
答案 1 :(得分:1)
他们都是一回事。 “监视器”提供两种功能。请注意,synchronized
块的VM指令称为monitorenter
和monitorexit
monitorenter
上可能会发生争用(即进入synchronized
阻止)或wait
(当它唤醒时会尝试重新获取锁定。)
相比之下,Lock
的{{1}}和Condition
接口显示为单独的对象。它们的行为类似于监视器(java.util.concurrent
重新获取锁定,可能需要与另一个线程的Condition.await()
竞争。)
答案 2 :(得分:1)
您可以 使用wait()
获取监视器。恰恰相反:您首先必须使用synchronized
获取显示器,然后才能使用wait()
,否则您将获得IllegalMonitorStateException
。
所以你描述的区别不存在。