开发者

JAVA并发Monitor工作原理图解

目录
  • 一、前言
  • 二、Monitor 的数据结构
  • 三、Monitor 的工作流程
    • 工作流程图解
  • 四、Monitor 和锁的演进机制
    • 五、Monitor 的作用总结表

      一、前言

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

      二、Monitor 的数据结构

      JAVA并发Monitor工作原理图解

      三、Monitor 的工作流程

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

      • 如果 Monitor 没有被其他线程持有,线程获得锁(成为 Owner)。
      • 如果已经持有:
        • 若是当前线程自身(重入),增加计数器。
        • 否则,进入 Entry Queue 阻塞等待。

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

      • 释放锁:减少计数器;
      • 若计数为 0,则清空 Owner,并唤醒 Entry Queue 中的线程开始争夺锁。

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

      • wait()
        • 当前线程释放锁,加入 Wait Set,进入等待状态;
      • notify()
        • 将 Wait Set 中随机选择一个线程移入 Entry Queue,等待重新竞争锁。

      工作流程图解

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

      JAVA并发Monitor工作原理图解

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

      JAVA并发Monitor工作原理图解

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

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

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

      • 其他线程调用notify()notifyAll()唤醒它
      • 等待超时(如果使用了wait(long timeout)方法)
      • 被中断(调用interrupt()方法)

      四、Monitor 和锁的演进机制

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

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

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

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

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

      JAVA并发Monitor工作原理图解

      五、Monitor 的作用总结表

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

      到此这篇关于JAVA并发Monitor工作原理图解的文章就介绍到这了,更多相关java并发Monitor工作原理内容请搜索编程客栈(www.cppcns.http://www.devze.comcom)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜