首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

同步方法与同步代码块的差异

2012-12-26 
同步方法与同步代码块的区别当JVM执行一个方法时,执行中的线程识别该方法的method_info结构是否有ACC_SYNC

同步方法与同步代码块的区别
当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}


热点排行