4.11多线程--Monitor1

  • Java 对象头
  • Monitor(锁)
    • 原理之 synchronized
    • 原理之 synchronized 进阶(下一篇)

Java 对象头

以 32 位虚拟机为例
普通对象


image.png

Klass Word 指向类的class对象

数组对象


image.png

其中 Mark Word 结构:


image.png

age 回收机制使用
biassed_lock 轻量锁 ,01/00/10/11 加锁状态

一个 int 数据 占 4 个字节,一个 Integer 占 8(对象头) + 4(数据) 个字节

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

image.png

image.png

image.png

线程 Thread2 要执行临界区代码,会将 Java 对象 obj 与 操作系统的一个对象 Monitor 关联(Mark Word 指向 Monitor)


image.png

image.png

image.png

image.png

过程描述:

  1. 线程 Thread-2 执行到 synchronized(obj) 时,检查 obj 的 Mark Word 及锁状态,发现没有,就将 Mark Word 存放一个 Monitor 对象的地址,并将这个 Monitor 对象的 Owner 改成自己。
  2. 如果 Thread-2 执行过程中,Thread-3 执行到 synchronized(obj) ,发现 obj 的 Mark Word 指向了一个 Monitor 对象,并且 Owner 有值,自觉进入 Monitor 的 EntryList 中 BLOCKED
  3. Thread-2 执行完该代码块后,会将自己与 Owner 断开,唤醒 EntryList 中 BLOCKED 的线程

原理之 synchronized

static final Object lock = new Object(0;
static int counter = 0;
public static void main(String[] args){
  synchronized(lock){
    counter++;
  }
}
image.png
  1. ‘#2’lock 对象 ‘#3’counter对象
  2. dup 复制 lock
  3. astore_1 将复制的 lock 引用 保存到一个 slot1 对象

你可能感兴趣的:(4.11多线程--Monitor1)