wen866595 发表于 2013-1-26 15:19:15

同步方法与同步代码块的区别

当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:athrowException table:   from   totarget type   4    10    11   any    11    14    11   any}
页: [1]
查看完整版本: 同步方法与同步代码块的区别