在Java Language Spec, Section 17.1: Synchronization中,
Java中的每个对象都与一个监视器关联,线程可以锁定或解锁监视器。
第17.2节:
每个对象除了具有关联的监视器外,还具有关联的等待集。等待集是一组线程。
首次创建对象时,其等待集为空。将线程添加到等待集中或从等待集中删除线程的基本操作是原子的。等待集只能通过方法
Object.wait
,Object.notify
和Object.notifyAll
来操作。
这里的问题是,monitor
是什么,似乎它是一个包含等待集的对象?
我研究了关于stackoverflow的类似问题What's a monitor in Java?,但答案并不十分清楚。
的更多信息监视器是一种控制并发访问对象的机制。
监视器是同时具有锁和等待集的实体。在Java中,任何对象都可以充当监视器。
每个对象的同步状态被编码在VM对象表示的第一个单词(
the so-called mark word
)中。对于几种状态,标记字被多路复用以指向其他同步元数据。 (As an aside, in addition, the mark word is also multiplexed to contain GC age data, and the object's identity hashCode value.
)状态为:
中立:解锁
偏爱:锁定/解锁+未共享
堆栈已锁定:已锁定+共享但无竞争标记标记指向 所有者线程堆栈上的已替换标记字。
已膨胀:锁定/解锁+共享和竞争线程被阻止 在monitorenter或wait()中。标记指向重量级 “对象监视器”结构。[8]
我猜是否monitor
是objectmonitor
结构?但是objectmonitor
最初不会创建,仅在由于争用而使用重锁时才使用。
答案 0 :(得分:1)
监视器是可以执行某些操作的概念。任何实现监视器概念抽象操作的东西都是很好的实现。
此概念在HotSpot中用标记词加上您引用的有关标记词的文字中描述的所有内容实现。它不是单个数据结构。