`
wen866595
  • 浏览: 264737 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多
当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 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."<init>":()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

}





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics