
Monitor原理
如果当前线程已经持有锁,则设置Monitor的 如果其他线程试图获取锁,则将其加入 当当前线程释放锁后,JVM会唤醒 等待的线程会被转移到
发布日期:2025-04-14 18:12:31
浏览次数:7
分类:精选文章
本文共 1250 字,大约阅读时间需要 4 分钟。
Java Monitor和对象头深度解析
Java对象头概述
在Java虚拟机(JVM)中,Java对象和虚拟机内部对象都有一个共同的对象头格式。这个对象头包含了关于堆对象的布局、类型、GC状态、同步状态以及标识哈希码的基本信息。了解对象头的结构对于理解Java内存管理和优化非常重要。
Mark Word和Klass Word的组成
Java对象头由Mark Word和Klass Word两部分组成。
Mark Word(标记字)
Mark Word用于存储对象运行时的关键信息,包括:
- 哈希码(HashCode):用于快速查找对象,通过
System.identityHashCode()
延迟计算,并将结果存储在Mark Word中。 - GC分代年龄(Age):记录对象被垃圾回收器处理的次数,决定是否将对象转移到老年代。
- 锁状态标志(Lock State):表示对象当前的锁状态。
- 线程持有的锁(Biased Lock):在偏向锁模式下,存储持有锁的线程ID。
- 偏向时间戳(Epoch):记录偏向锁的时间戳,用于CAS操作时判断对象是否偏向当前线程。
- 轻量锁指针(Ptr to Lock Record):用于轻量锁状态下存储锁记录的指针。
- 重量锁指针(Ptr to Heavyweight Monitor):用于重量锁状态下存储Monitor的指针。
Mark Word在32位JVM中占用32位,在64位JVM中占用64位。无论位数如何,Mark Word的组成内容基本一致。
Klass Word(类指针)
Klass Word用于指向Java类的元数据,包括类的版本、加载时间和其他与类相关的信息。
Monitor锁机制
Monitor(管程)是Java同步机制的核心,用于管理多线程访问共享资源的同步。每个Java对象都可以关联一个Monitor对象,当使用sync
关键字对对象进行同步时,JVM会将对象头的Mark Word指向该Monitor。
Monitor的状态与行为
Monitor的初始状态下,Owner
字段为null。当一个线程尝试获取锁时:
Owner
为当前线程。EntryList
,进入等待状态(BLOCK状态)。EntryList
中的线程,进入非公平的锁竞争。WaitSet
中,进入WAITING状态。Monitor的结构
Monitor对象包含以下字段:
- Owner:持有锁的线程ID。
- WaitSet:存储处于等待状态的线程。
- EntryList:存储等待获取锁的线程。
- Heavyweight Monitor Header:在重量锁状态下指向Monitor的指针。
参考文章
通过理解Java对象头和Monitor锁机制,可以更好地优化Java程序的内存管理和多线程性能。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年05月12日 17时52分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MFC之处理消息映射的步骤...
2025-04-13
MFC对话框屏幕居中
2025-04-14
MFC工作笔记0003---WindowsAPI与MFC的关系
2025-04-14
MFC工作笔记0005---::在vc++中是什么意思
2025-04-14
MFC工作笔记0011---atoi的用法
2025-04-14
MFC数据类型
2025-04-14
MFC模态对话框和非模态对话框
2025-04-14
mha高可用
2025-04-14
Miaoo朋友圈程序全完整版源码
2025-04-14
Microsoft Security Updates API 使用教程
2025-04-14
MyBatis学习总结(6)——调用存储过程
2025-04-14
Mock.js 的语法规范学习
2025-04-14
mockcpp & testngpp在2010.7~11月的改进
2025-04-14
Mock在接口测试中的实际应用
2025-04-14
Mock模拟测试实战
2025-04-14
Modbus RTU串口通信实验
2025-04-14
Modbus RTU和Modbus TCP之间的区别
2025-04-14