当JVM执行一个方法时,执行中的线程识别该方法的method_info结构是否有ACC_SYNCHRONIZED标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。如果有异常发生,线程自动释放锁。
同步化一个方法块会超过JVM对获取对象锁和异常处理的内置支持,要求以字节代码显式写入功能。如果使用同步方法读取一个方法的字节代码,就会看到有十几个额外的操作用于管理这个功能。
Java代码
- public class Sync {
- private int i;
- public synchronized int synchronizedMethodGet() {
- return i;
- }
- public int synchronizedBlockGet() {
- synchronized( this ) {
- return i;
- }
- }
- }
反编译出的字节码:
Java代码
- D:\Java\jdk1.6.0_02\bin>javap -c Sync
- Compiled from "Sync.java"
- public class Sync extends java.lang.Object{
- public Sync();
- Code:
- 0: aload_0
- 1: invokespecial #1; //Method java/lang/Object."
":()V - 4: return
- public synchronized int synchronizedMethodGet();
- Code:
- 0: aload_0
- 1: getfield #2; //Field i:I
- 4: ireturn
- public int synchronizedBlockGet();
- Code:
- 0: aload_0
- 1: dup
- 2: astore_1
- 3: monitorenter
- 4: aload_0
- 5: getfield #2; //Field i:I
- 8: aload_1
- 9: monitorexit
- 10: ireturn
- 11: astore_2
- 12: aload_1
- 13: monitorexit
- 14: aload_2
- 15: athrow
- Exception table:
- from to target type
- 4 10 11 any
- 11 14 11 any
- }
原文链接:http://wen866595.javaeye.com/blog/974851
【编辑推荐】