JUC学习笔记——共享模型之管程( 七 )

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 对象的指针
我们给出简单示例图:
JUC学习笔记——共享模型之管程

文章插图
我们来做简单解释:
  • 每个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 的对象不会关联监视器,不遵从以上规则
synchronized锁这小节我们将会介绍synchronized底层原理和相关锁的内容

经验总结扩展阅读