当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; 4: return public synchronized int synchronizedMethodGet(); Code: 0: aload_0 1: getfield #2; 4: ireturn public int synchronizedBlockGet(); Code: 0: aload_0 1: dup 2: astore_1 3: monitorenter 4: aload_0 5: getfield #2; 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 } |