Java并发编程之Monitor

本文深入探讨了Java对象头的结构,特别是在32位和64位虚拟机中的差异,以及MarkWord的组成。重点讲解了Monitor(监视器或管程)的工作原理,包括如何通过synchronized实现线程同步,以及Monitor中的Owner、EntryList和WaitSet等关键概念。当线程获取锁后,其他线程将在EntryList中等待,释放锁后进行非公平的竞争。此外,还强调了synchronized关键字与Monitor对象的关联,以及未使用synchronized时对象与Monitor的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Monitor

Monitor概念

Java对象头

以 32 位虚拟机为例

普通对象
在这里插入图片描述
数组对象
在这里插入图片描述
其中 Mark Word 结构为
在这里插入图片描述
64 位虚拟机 Mark Word
在这里插入图片描述

Monitor 原理

Monitor 被翻译为监视器管程
每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的
Mark Word 中就被设置指向 Monitor 对象的指针

Monitor 结构如下
在这里插入图片描述

  • 刚开始 Monitor 中 Owner 为 null
  • 当 Thread-2 执行 synchronized(obj) 就会将 Monitor 的所有者 Owner 置为 Thread-2,Monitor中只能有一个 Owner
  • 在 Thread-2 上锁的过程中,如果 Thread-3,Thread-4,Thread-5 也来执行 synchronized(obj),就会进入EntryList BLOCKED
  • Thread-2 执行完同步代码块的内容,然后唤醒 EntryList 中等待的线程来竞争锁,竞争的时是非公平的
  • 图中 WaitSet 中的 Thread-0,Thread-1 是之前获得过锁,但条件不满足进入 WAITING 状态的线程,后面讲wait-notify 时会分析
  • synchronized 必须是进入同一个对象的 monitor 才有上述的效果
  • 不加 synchronized 的对象不会关联监视器,不遵从以上规则
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值