synchronized 语句块里代码出现异常会怎么样?

栏目: 服务器 · 发布时间: 7年前

内容简介:synchronized 语句块里代码出现异常会怎么样?

前几天同组的一个小伙伴忽然问我一个问题:synchronized 里异常挂掉会怎么样,锁释放不释放,为什么?我当时的本能回答是:锁肯定会释放,不释放就出问题了,应该会在异常退出时自动释放掉。但至于为什么,却也想不起来了,于是重新翻看了下《深入理解 Java 虚拟机》, 找到了答案。

先介绍 Java 虚拟机的两个关于同步的指令

字节码 助记符 指令含义
0xc2 monitorenter 获得对象的锁,用于同步方法或同步块
0xc3 monitorexit 释放对象的锁,用于同步方法或同步块

下面举个例子说明一下:

public class Test {
	
    void onlyMe(Foo f) {
		synchronized(f) {
			doSomething();
		}
	}

	void doSomething() {}

	private static class Foo {

	}
}

经 javac 编译后,这段代码生成的字节码序列如下(仅仅截取了 onlyMe 方法):

synchronized 语句块里代码出现异常会怎么样?

通过上面可以看到有两个 monitorexit 指令,第一个 monitorexit 指令如果正确执行,会走到下面的 goto 指令,直接跳转到 18 行 return,而如果发生异常,下面的 astore_3 和 aload_2 指令会继续执行异常问题, aload_2 将把局部变量 Slow 2 的元素 (即 f ) 入栈,下一步会继续执行 monitorexit 指令退出同步。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

支持向量机

支持向量机

邓乃扬、田英杰 / 科学出版社 / 2009-8 / 48.00元

《支持向量机:理论、算法与拓展》以分类问题(模式识别、判别分析)和回归问题为背景,介绍支持向量机的基本理论、方法和应用。特别强调对所讨论的问题和处理方法的实质进行直观的解释和说明,因此具有很强的可读性。为使具有一般高等数学知识的读者能够顺利阅读,书中首先介绍了最优化的基础知识。《支持向量机:理论、算法与拓展》可作为理工类、管理学等专业的高年级本科生、研究生和教师的教材或教学参考书,也可供相关领域的......一起来看看 《支持向量机》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试