Monitor这小节我们将会介绍Monitor
Java对象头在正式开始Monitor介绍之前,我们先来介绍一下Java对象头的定义:
# 以下内容均以32位虚拟机为例# 普通对象|--------------------------------------------------------------||Object Header (64 bits)||------------------------------------|-------------------------||Mark Word (32 bits)|Klass Word (32 bits)||------------------------------------|-------------------------|# 数组对象|---------------------------------------------------------------------------------||Object Header (96 bits)||--------------------------------|-----------------------|------------------------||Mark Word(32bits)|Klass Word(32bits)|array length(32bits)||--------------------------------|-----------------------|------------------------|# 其中 Mark Word 结构为|-------------------------------------------------------|--------------------||Mark Word (32 bits)|State||-------------------------------------------------------|--------------------||hashcode:25| age:4 |biased_lock:0|01|Normal||-------------------------------------------------------|--------------------||thread:23|epoch:2| age:4 |biased_lock:1|01|Biased||-------------------------------------------------------|--------------------||ptr_to_lock_record:30|00| Lightweight Locked ||-------------------------------------------------------|--------------------||ptr_to_heavyweight_monitor:30|10| Heavyweight Locked ||-------------------------------------------------------|--------------------|||11|Marked for GC||-------------------------------------------------------|--------------------|# 其中Klass Word主要存储对象类型名称# 64位虚拟机的 Mark Word 结构为|--------------------------------------------------------------------|--------------------||Mark Word (64 bits)|State||--------------------------------------------------------------------|--------------------|| unused:25 | hashcode:31 | unused:1 | age:4 | biased_lock:0 |01|Normal||--------------------------------------------------------------------|--------------------|| thread:54 |epoch:2| unused:1 | age:4 | biased_lock:1 |01|Biased||--------------------------------------------------------------------|--------------------||ptr_to_lock_record:62|00| Lightweight Locked ||--------------------------------------------------------------------|--------------------||ptr_to_heavyweight_monitor:62|10| Heavyweight Locked ||--------------------------------------------------------------------|--------------------|||11|Marked for GC||--------------------------------------------------------------------|--------------------|
Monitor概述我们来简单介绍一下Monitor:
- Monitor 被翻译为监视器或管程
- 每个 Java 对象都可以关联一个 Monitor 对象,就是我们之前创建的obj对象
- 如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针

文章插图
我们来做简单解释:
- 每个obj都由MarkWord来绑定一个Monitor
- 每个线程都需要经过synchronized(obj)方法进入Monitor
- 首先Monitor主要分为三个部分:WaitSet,EntryList,Owner
- Owner:属于当前Monitor的正常运行区间,例如Thread-2就是目前运行线程
- EntryList:属于当前Monitor的等待运行区间,需要等到Thread-2结束线程释放锁资源,Thread3等才可以抢夺锁
- WaitSet:属于之前获得过锁,但条件不满足进入 WAITING 状态的线程,后面讲 wait-notify 时会分析
- synchronized 必须是进入同一个对象的 monitor 才有上述的效果
- 不加 synchronized 的对象不会关联监视器,不遵从以上规则
经验总结扩展阅读
- Seata Server 1.5.2 源码学习
- 2022极端高温!机器学习如何预测森林火灾?? 万物AI
- 1.nginx学习
- 常用Python库整理
- 2023年谷雨学习运有所提升的星座学业突飞猛进
- notability怎么一键清空手写笔记 notability怎么清除所有笔
- 图学习参考资料 词向量word2vec
- 五 RK3568开发笔记:在虚拟机上使用SDK编译制作uboot、kernel和ubuntu镜像
- realme笔记本最新消息_realme笔记本即将发布
- JUC学习笔记——进程与线程