JVM(热点)中的“监视”是什么特定对象?

时间:2018-12-28 03:26:36

标签: java multithreading jvm-hotspot

Java Language Spec, Section 17.1: Synchronization中,

  

Java中的每个对象都与一个监视器关联,线程可以锁定或解锁监视器。

第17.2节:

  

每个对象除了具有关联的监视器外,还具有关联的等待集。等待集是一组线程。

     

首次创建对象时,其等待集为空。将线程添加到等待集中或从等待集中删除线程的基本操作是原子的。等待集只能通过方法Object.waitObject.notifyObject.notifyAll来操作。

这里的问题是monitor是什么,似乎它是一个包含等待集的对象?

我研究了关于stackoverflow的类似问题What's a monitor in Java?,但答案并不十分清楚。

  

监视器是一种控制并发访问对象的机制。

     

监视器是同时具有锁和等待集的实体。在Java中,任何对象都可以充当监视器。

有关Hotspot runtime overview

的更多信息
  

每个对象的同步状态被编码在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]

我猜是否monitorobjectmonitor结构?但是objectmonitor最初不会创建,仅在由于争用而使用重锁时才使用。

1 个答案:

答案 0 :(得分:1)

监视器是可以执行某些操作的概念。任何实现监视器概念抽象操作的东西都是很好的实现。

此概念在HotSpot中用标记词加上您引用的有关标记词的文字中描述的所有内容实现。它不是单个数据结构。