Java字节码指令总结
程序员文章站
2022-06-28 16:38:21
总结《深入理解Java虚拟机》第6章 6.4节的一些知识...
参考:《深入理解Java虚拟机》第6章 6.4节
同步指令
方法级同步
不需要使用字节码指令显式实现
代码示例
synchronized void onlyMe() {
return;
}
方法级同步字节码
通过flags: ACC_SYNCHRONIZED
,实现
synchronized void onlyMe();
descriptor: ()V
flags: (0x0020) ACC_SYNCHRONIZED
Code:
stack=0, locals=1, args_size=1
0: return
LineNumberTable:
line 13: 0
LocalVariableTable:
Start Length Slot Name Signature
0 1 0 this LDemo;
具体流程
代码段同步
由字节码指令monitorenter
, monitorexit
实现
代码示例
void onlyMe(Integer i) {
synchronized (i) {
return;
}
}
段级同步字节码
void onlyMe(java.lang.Integer);
descriptor: (Ljava/lang/Integer;)V
flags: (0x0000)
Code:
stack=2, locals=4, args_size=2
0: aload_1
1: dup
2: astore_2
3: monitorenter // 获取管程
4: aload_2
5: monitorexit // 释放管程
6: return
7: astore_3
8: aload_2
9: monitorexit // 释放管程
10: aload_3
11: athrow
Exception table:
from to target type
4 6 7 any
7 10 7 any
编译器在synchronized
之前和之后自动加上了monitorenter
, monitorexit
指令,并且自动生成了异常处理代码,防止出现异常不能释放管程。
本文地址:https://blog.csdn.net/qq_43709922/article/details/112024056