同步方法与同步代码块的区别
当JVM执行一个方法时,执行中的线程识别该方法的method_info结构是否有ACC_SYNCHRONIZED标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。如果有异常发生,线程自动释放锁。
同步化一个方法块会超过JVM对获取对象锁和异常处理的内置支持,要求以字节代码显式写入功能。如果使用同步方法读取一个方法的字节代码,就会看到有十几个额外的操作用于管理这个功能。
public class Sync {private int i; public synchronized int synchronizedMethodGet() { return i; } public int synchronizedBlockGet() { synchronized( this ) { return i; } }}D:\Java\jdk1.6.0_02\bin>javap -c SyncCompiled from "Sync.java"public class Sync extends java.lang.Object{public Sync(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: returnpublic synchronized int synchronizedMethodGet(); Code: 0: aload_0 1: getfield #2; //Field i:I 4: ireturnpublic 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}