Monitor对象头
在java中普通对象的对象头信息
- Mark Word记录分代年龄、加锁的状态;
- Klass Word指向类对象的指针;
其中Mark Word结构
monitor执行原理
我们在加了重量级锁synchronize后,对象头的mark word会指向一个monitor,monitor是操作系统层面的c语言与java无关,如果此时monitor中没有owner,那么当前线程执行,如果已经有owner那么当前线程记录在monitor中的EntryList中阻塞等待,
等待owner释放后,抢夺成为owner;
字节码角度
案例
public class Monitor_Test {
static final Object lock = new Object();
static int counter;
public static void main(String[] args) {
synchronized (lock){
counter++;
}
}
}
编译
monitorenter将对象头的mark word存储monitor指针;
monitorexit释放monitor指针,还原mark word保存的分代年龄和hash;
goto24即return本该结束,但是如果代码出现异常,没有正常执行?
19行到23行处理异常,athrow抛出;