这一章节我们来讨论一下synchronized同步代码块在jvm层面的执行。
1.synchronized同步代码块是依赖字节码指令来控制
代码清单:
package com.ray.deepintothread.ch02.topic_26;
/**
*
* @author RayLee
*
*/
public class SynchBlock {
private Object object = new Object();
public void test1() {
synchronized (object) {
}
}
public void test2() {
}
}
反编译指令:javap -c,这里需要注意的是必须加上-c不然很多信息都不会打印出来
C:\Users\Administrator>javap -c E:\workspace\DeepIntoThread\bin\com\ray\deepinto
thread\ch02\topic_26\SynchBlock.class
反编译结果:
Compiled from "SynchBlock.java"
public class com.ray.deepintothread.ch02.topic_26.SynchBlock {
public com.ray.deepintothread.ch02.topic_26.SynchBlock();
Code:
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":
()V
4: aload_0
5: new #3 // class java/lang/Object
8: dup
9: invokespecial #10 // Method java/lang/Object."<init>":
()V
12: putfield #12 // Field object:Ljava/lang/Object;
15: return
public void test1();
Code:
0: aload_0
1: getfield #12 // Field object:Ljava/lang/Object;
4: dup
5: monitorenter
6: monitorexit
7: return
public void test2();
Code:
0: return
}
通过反编译结果我们可以看见,对比两个不同的方法,反编译出来的结果是明显不一样的,在同步代码块方法里面,它出现了monitorenter和monitorexit这两个字节码指令,同步代码块就是通过这两个命令来实现的,这两个命令向来都是配对出现的。
2.执行过程
当进入方法后,不一定马上进入同步状态,只有进入同步代码块的时候,才是真正的同步开始,
代码块持有对象锁->执行->执行完成->释放锁
如果代码块内部抛出异常,而代码块或者方法体没有相应的处理,则立刻释放锁。
3.其实在更深的层面,同步代码块跟同步方法的实现都是一样的,都是通过monitorenter和monitorexit这两个字节码指令来实现的,不过jvm隐藏了同步方法的字节码指令。
总结:这一章节我们讨论了synchronized同步代码块在jvm是怎样执行的?
这一章节就到这里,谢谢
------------------------------------------------------------------------------------
我的github:https://github.com/raylee2015/DeepIntoThread
目录:http://blog.csdn.net/raylee2007/article/details/51204573