- 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
过程描述:
- 线程 Thread-2 执行到 synchronized(obj) 时,检查 obj 的 Mark Word 及锁状态,发现没有,就将 Mark Word 存放一个 Monitor 对象的地址,并将这个 Monitor 对象的 Owner 改成自己。
- 如果 Thread-2 执行过程中,Thread-3 执行到 synchronized(obj) ,发现 obj 的 Mark Word 指向了一个 Monitor 对象,并且 Owner 有值,自觉进入 Monitor 的 EntryList 中 BLOCKED
- 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
- ‘#2’lock 对象 ‘#3’counter对象
- dup 复制 lock
- astore_1 将复制的 lock 引用 保存到一个 slot1 对象