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

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





©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页