关闭

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

发表于:2011-5-04 10:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wen866595    来源:51Testing软件测试网采编

#
java
#
JAVA

  当JVM执行一个方法时,执行中的线程识别该方法的method_info结构是否有ACC_SYNCHRONIZED标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。如果有异常发生,线程自动释放锁。

  同步化一个方法块会超过JVM对获取对象锁和异常处理的内置支持,要求以字节代码显式写入功能。如果使用同步方法读取一个方法的字节代码,就会看到有十几个额外的操作用于管理这个功能。

  Java代码

  • public class Sync {     
  •     private int i;     
  •     
  •     public synchronized int synchronizedMethodGet() {     
  •         return i;     
  •     }     
  •     
  •     public int synchronizedBlockGet() {     
  •         synchronizedthis ) {     
  •             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//Method java/lang/Object."":()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     
  •     
  • }
  • 《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号