在java语言里,我们要进行同步块的控制,一般使用锁和synchronization关键字,用lock同步是在代码层进行资源的抢占控制,
而用synchronization进行的同步jvm层的控制,在一个方法体里,被synchronizatioin修饰的语句块,其实在编译成字节码时,
会被monitorenter和monitorexit指令包围,多个线程在进入monitorenter控制的字节码时,需要进入等候队列排队,同时会
隐士的在字节码里添 加异常处理器,在异常处理器里添加monitorexit指令,保证了同步块里出现异常时能释放资源。
void aMethod(Object o){
synchronized(f) {
doSomething();
}
}
编译后代码如下字节码:
Method void aMethod(Object){
04 aload_1 //把参数0从本地变量表加载到操作数栈
05 dup //备份操作数栈顶元素,及备份栈顶元素
06 astore_2 //把备份的操作栈元素o赋值给本地变量2
07 monitorenter //进入o对象关联的监视器
08 aload_0 // 加载this到操作栈
09 invokevirtual #5 //调用doSomeThing()
10 aload_2 //加载o进操作栈
11 monitorexit //退出o对象关联的monitor
12 goto 18 //返回
13 astore_3 //出现异常时执行这里,把栈顶元素保存到本地变量3
14 aload_2 // 加载本地变量2(0对象)进操作栈顶
15 monitorexit //退出o对象关联的监视器Monitor
16 aload_3 //加载本地变量3进栈顶
17 athrow //抛出异常
18 return //返回
Exceptiono table:
From To Target Type
4 10 13 any
13 16 13 any
return //