java中synchronization修饰的同步块的同步原理及出现异常时的自动资源释放原理
2017-03-12 15:54
591 查看
在java语言里,我们要进行同步块的控制,一般使用锁和synchronization关键字,用lock同步是在代码层进行资源的抢占控制,
而用synchronization进行的同步jvm层的控制,在一个方法体里,被synchronizatioin修饰的语句块,其实在编译成字节码时,
会被monitorenter和monitorexit指令包围,多个线程在进入monitorenter控制的字节码时,需要进入等候队列排队,同时会
隐士的在字节码里添
加异常处理器,在异常处理器里添加monitorexit指令,保证了同步块里出现异常时能释放资源。
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 //
而用synchronization进行的同步jvm层的控制,在一个方法体里,被synchronizatioin修饰的语句块,其实在编译成字节码时,
会被monitorenter和monitorexit指令包围,多个线程在进入monitorenter控制的字节码时,需要进入等候队列排队,同时会
隐士的在字节码里添
加异常处理器,在异常处理器里添加monitorexit指令,保证了同步块里出现异常时能释放资源。
如有同步java语句:
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 //
相关文章推荐
- java线程安全之synchronized锁重入及出现异常锁自动释放(五)
- 动态分配资源的自动释放 – auto_ptr的实现原理
- 动态分配资源的自动释放 – auto_ptr的实现原理
- C++ try 块里 new 类对像构造异常时发生“回退”并对资源自动释放
- JAVA中的 try( ){ } ==== 》 try-with-resources 资源自动释放
- try(代码){},Java 7 新的 try-with-resources 语句,自动资源释放
- Java 7 新的 try-with-resources 语句,自动资源释放
- Python代码实现Java本地化资源字符串的检查,防止出现空指针异常
- JAVA中的 try( ){ } ==== 》 try-with-resources 资源自动释放
- 动态分配资源的自动释放 – auto_ptr的实现原理
- Java 7 try-with-resources 语句,自动资源释放,提高容错率!
- 动态分配资源的自动释放 – auto_ptr的实现原理
- C++ 动态分配资源的自动释放 – auto_ptr的实现原理
- Java 7 新的 try-with-resources 语句,自动资源释放
- 动态分配资源的自动释放 - auto_ptr的实现原理
- 动态分配资源的自动释放 – auto_ptr的实现原理 .
- java 同步中的线程出现异常会放弃锁吗
- Java 7 新的 try-with-resources 语句,自动资源释放
- 关于Cocos Creator中的自动释放资源、延迟加载资源原理解读
- Java 7 新的 try-with-resources 语句,自动资源释放