从头认识多线程-2.26 synchronized同步代码块在jvm是怎样执行的?

来源:互联网 发布:网络诈骗需要什么证据 编辑:程序博客网 时间:2024/05/18 02:42

这一章节我们来讨论一下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\deepintothread\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





0 0
原创粉丝点击