大家好,我是walker
一个从文科自学转行的程序员~
爱好编程,偶尔写写编程文章和生活
欢迎关注公众号【I am Walker】,回复“电子书”,就可以获得200多本编程相关电子书哈~
我的gitee:https://gitee.com/shen-chuhao/walker.git 里面很多技术案例!
synchronized是Java中的一个关键字,在使用的过程中并没有看到显示的加锁和解锁过程。
因此有必要通过javap命令,查看相应的字节码文件。
synchronized 同步语句块的情况
查找案例
1、编写测试类
package synchronizedTest;
public class SynchronizedTheory {
public void getTheory(){
synchronized (this){
System.out.println("执行代码块");
}
}
public static void main(String[] args) {
SynchronizedTheory synchronizedTheory = new SynchronizedTheory();
synchronizedTheory.getTheory();
}
}
注意:这里在编写之后,需要先执行以下main方法,然后就会出现编译文件,如果不用这种方式的话,使用maven的package或者install也可以
2、找到对应的编译文件,注意不是.java文件,而是.class文件
3、进入到对应的文件下
4、按右键+shift键,点击powerShell
之后执行命令javap -c -v SynchronizedTheory
就会出现下面的结果了
这里可以发现,一开始有个monitorenter,之后有两个monitorexit指令,
为什么会有两个monitorexit呢?
这个主要是防止在同步代码块中线程因异常退出,而锁没有得到释放,这必然会造成死锁(等待的线程永远获取不到锁)。
因此最后一个monitorexit是保证在异常情况下,锁也可以得到释放,避免死锁。仅有ACC_SYNCHRONIZED这么一个标志,该标记表明线程进入该方法时,需要monitorenter,退出该方法时需要monitorexit。