给如下的Syncronized示例代码
static final Object lock = new Object();
static int counter = 0;
public static void main(String[] args) {
syncronized(lock) {
count++;
}
}
对应的字节码指令为:

代码的解释如下:
- 0行,获取lock引用
- 复制一份lock引用
- 将lock引用存起来
- 将lock对象的markword置为monitor的指针(重量级锁对象会关联一个操作系统底层的monitor)
- 6-11 都是做count++的操作(可以看出来count++对应字节码不止一条指令)
- 14 代表同步代码块执行完毕,取出lock对象,将其markword中的monitor指针还原,也就是将markword置为正常状态,在 java对象头的结构 一文中的normal状态
- 20-23是程序发生异常时会执行的操作
文章评论