这一章节我们来讨论一下synchronized同步方法在jvm层面的执行。
1.synchronized同步方法是不依赖字节码指令来控制
代码清单:
package com.ray.deepintothread.ch02.topic_25;
/**
*
* @author RayLee
*
*/
public class SynchMethod {
public synchronized void test1() {
}
public void test2() {
}
}
反编译指令:javap -c,这里需要注意的是必须加上-c不然很多信息都不会打印出来
C:\Users\Administrator>javap -c E:\workspace\DeepIntoThread\bin\com\ray\deepinto
thread\ch02\topic_25\SynchMethod.class
Compiled from "SynchMethod.java"
public class com.ray.deepintothread.ch02.topic_25.SynchMethod {
public com.ray.deepintothread.ch02.topic_25.SynchMethod();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":
()V
4: return
public synchronized void test1();
Code:
0: return
public void test2();
Code:
0: return
}
通过反编译结果我们可以看见,对比两个不同的方法,反编译出来的结果是一样的,没有指令在里面,因为同步方法是不依赖字节码指令来实现
2.synchronized同步方法是通过标记方法常量池里面的方法表结构体(method_info structure)的assess_flags=ACC_SYNCHRONIZED来控制
就是说,当每一个方法编译时,都已经标记了相应的方法信息
method_info structure:(由于每一个变量里面的值很多,就不一一展示,如果读者想了解,可以参考java虚拟机规范4.6章节)
method_info {
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}
方法持有对象锁->执行->执行完成->释放锁
如果方法内部抛出异常,而方法体没有相应的处理,则立刻释放锁。
3.方法级的同步是隐式的
根据上面反编译的结果,由于没有明显的字节码指令,因此方法级的同步时隐式的。
总结:这一章节我们讨论了synchronized同步方法在jvm是怎样执行的。
这一章节就到这里,谢谢
------------------------------------------------------------------------------------
我的github:https://github.com/raylee2015/DeepIntoThread
目录:http://blog.csdn.net/raylee2007/article/details/51204573