java中synchronization修饰的同步块的同步原理及出现异常时的自动资源释放原理

在java语言里,我们要进行同步块的控制,一般使用锁和synchronization关键字,用lock同步是在代码层进行资源的抢占控制,

而用synchronization进行的同步jvm层的控制,在一个方法体里,被synchronizatioin修饰的语句块,其实在编译成字节码时,

会被monitorenter和monitorexit指令包围,多个线程在进入monitorenter控制的字节码时,需要进入等候队列排队,同时会

隐士的在字节码里添
加异常处理器,在异常处理器里添加monitorexit指令,保证了同步块里出现异常时能释放资源。

如有同步java语句:

void  aMethod(Object o){

   synchronized(f) {

      doSomething();

  }

}

编译后代码如下字节码:

 Method void aMethod(Object){

       04     aload_1                           //把参数0从本地变量表加载到操作数栈

       05      dup                                  //备份操作数栈顶元素,及备份栈顶元素

       06      astore_2                          //把备份的操作栈元素o赋值给本地变量2

       07      monitorenter                     //进入o对象关联的监视器

       08      aload_0                            // 加载this到操作栈

       09      invokevirtual    #5             //调用doSomeThing()

       10      aload_2                            //加载o进操作栈

       11      monitorexit                       //退出o对象关联的monitor

       12      goto     18                        //返回

       13      astore_3                          //出现异常时执行这里,把栈顶元素保存到本地变量3

       14      aload_2                           // 加载本地变量2(0对象)进操作栈顶

       15      monitorexit                      //退出o对象关联的监视器Monitor

       16      aload_3                          //加载本地变量3进栈顶

       17      athrow                            //抛出异常

       18      return                             //返回

    Exceptiono  table:

    From                 To             Target                     Type

    4                        10                13                         any

    13                      16                13                         any

             return                             //

你可能感兴趣的:(java)