java - JVM(热点)中的“监视器”是什么,一个特定的对象?
问题描述
在Java Language Spec, Section 17.1: Synchronization中,它说
Java 中的每个对象都与一个监视器相关联,线程可以锁定或解锁监视器。
第 17.2 节:
每个对象除了有一个关联的监视器之外,还有一个关联的等待集。等待集是一组线程。
首次创建对象时,其等待集为空。将线程添加到等待集中和从等待集中删除线程的基本操作是原子的。等待集仅通过方法
Object.wait
、Object.notify
和进行操作Object.notifyAll
。
这里的一个问题是,什么是monitor
,似乎它是一个包含等待集的对象?
我看过一个类似的问题What's a monitor in Java? 在stackoverflow上,但答案并不那么清楚。
监视器是控制对对象的并发访问的机制。
监视器是一个同时拥有锁和等待集的实体。在 Java 中,任何对象都可以用作监视器。
我获得了有关Hotspot 运行时概述的更多信息
每个对象的同步状态被编码在
the so-called mark word
VM 对象表示的第一个字 ( ) 中。对于几个状态,标记字被多路复用以指向额外的同步元数据。(As an aside, in addition, the mark word is also multiplexed to contain GC age data, and the object's identity hashCode value.
) 状态是:
中性:解锁
有偏见:锁定/解锁+未共享
Stack-Locked: Locked + Shared but uncontended 标记指向所有者线程堆栈上的移位标记字。
膨胀:锁定/解锁 + 共享和竞争线程在 monitorenter 或 wait() 中被阻塞。标记指向重量级的“objectmonitor”结构。 [8]
我猜如果 amonitor
是一个objectmonitor
结构?但objectmonitor
一开始不创建,仅在由于争用而使用重量级锁时使用。
解决方案
监视器是一个概念,您可以在其上执行某些操作。任何实现监视器概念的抽象操作的东西都是一个很好的实现。
该概念在 HotSpot 中的标记词以及您引用的关于标记词的文本中描述的所有内容中实现。它不是一个单一的数据结构。
推荐阅读
- c++ - What's the difference between push_back({ "George", 1 }) and push_back(Student("Jack", 10));
- django - Send data in Angular to backend Django for sending email
- javascript - 有人播放音频时如何获取帖子 ID?
- postgresql - 是否有可能找出哪个用户在 Postgres 中删除了一个表?
- json - 验证它以用于颤振时出现 JSON 错误
- iis - aspnet_regiis.exe/alternative 用于 .net core 3.1 加密
- python - TensorFlow:如何对向量和张量进行点积?
- javascript - 可以在没有 eval 的情况下从 Javascript 中的字符串插入字符串?
- scala - 如何使用数字从馈线中获取特定值?
- node.js - 每当我在改变映射组件后重新获取反应查询时,下一个组件的突变状态显示为“成功”