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

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

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

  Java代码

  publicclassSync{ privateinti; publicsynchronizedintsynchronizedMethodGet(){ returni; } publicintsynchronizedBlockGet(){ synchronized(this){ returni; } } }

  反编译出的字节码:

  Java代码

  D:\Java\jdk1.6.0_02\bin>javap-cSync Compiledfrom”Sync.java” publicclassSyncextendsjava.lang.Object{ publicSync(); Code: 0:aload_0 1:invokespecial#1;//Methodjava/lang/Object.””:()V4:return publicsynchronizedintsynchronizedMethodGet(); Code: 0:aload_0 1:getfield#2;//Fieldi:I4:ireturn publicintsynchronizedBlockGet(); Code: 0:aload_0 1:dup 2:astore_1 3:monitorenter 4:aload_0 5:getfield#2;//Fieldi:I8:aload_1 9:monitorexit 10:ireturn 11:astore_2 12:aload_1 13:monitorexit 14:aload_2 15:athrow Exceptiontable: fromtotargettype 41011any 111411any }

我要准备好行李启程了,谢谢关心我的家人和朋友,

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

相关文章:

你感兴趣的文章:

标签云: