java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java并发Monitor工作原理

JAVA并发Monitor工作原理图解

作者:嗜好ya

Monitor是Java中实现互斥锁(Mutual Exclusion)的核心工具,本文通过图文详解JAVA并发Monitor工作原理,感兴趣的朋友一起看看吧

一、前言

Monitor 是 Java 中实现 互斥锁(Mutual Exclusion) 的核心工具。只有一个线程可以持有某个对象的 Monitor,其他线程必须阻塞等待,直到该线程释放锁,JVM 中每个对象在重量级锁的情况才关联着一个 Monitor,当线程进入 锁等级为重量级的synchronized 代码时,必须先获得该对象的 Monitor。

二、Monitor 的数据结构

三、Monitor 的工作流程

(1)某线程尝试进入同步代码块(monitorenter)

(2)退出同步代码块(monitorexit)

(3)调用 wait/notify 时的行为

工作流程图解

线程零抢占到对象obj的锁,此时EntryQueue中存放一二三线程等待抢锁

此时对Thread-0调用wait()方法,Thread-0释放锁并且进入WaitSet,EntryQueue队列中的线程随机获取锁,假设Thread-2获取到锁

此时EntryQueue中的线程处于阻塞状态(BLOCKED),等待Thread-2释放锁再进行抢锁

而此时Thread-0线程进入等待状态(WAITING或TIMED_WAITING),不参与锁的竞争,只有恢复阻塞状态时才去参与锁的竞争

想要从等待状态恢复为阻塞状态的三种方法

四、Monitor 和锁的演进机制

JVM 为了性能优化,提供了 锁优化策略

锁类型描述
无锁默认状态,适用于单线程环境,Mark Word 存储对象的哈希码、分代年龄等信息。
偏向锁偏向于第一个访问线程,后续无竞争,Mark Word 会被替换为锁标志位(01)和持有锁的线程ID
轻量级锁多线程但无阻塞,通过 CAS 竞争
  • Mark Word 会被复制到线程栈中的锁记录(Lock Record)

  • Mark Word 被替换为指向锁记录的指针(00表示轻量级锁)

  • JVM 会撤销偏向锁,升级为轻量级锁

重量级锁Monitor 对象控制,线程进入阻塞队列,性能开销大,Mark Word 中存储指向 Monitor 对象(管程/互斥量)的指针

五、Monitor 的作用总结表

功能描述
互斥访问确保同一时间内只有一个线程访问共享资源
可重入性同一线程可重复进入临界区
线程协作(条件变量)支持 wait/notify 机制
阻塞调度管理 Entry Queue 和 Wait Set 的线程阻塞与唤醒
性能优化依据锁升级的核心控制结构

到此这篇关于JAVA并发Monitor工作原理图解的文章就介绍到这了,更多相关java并发Monitor工作原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文