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

    xiaoxiao2021-03-25  64

    在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                             //

    转载请注明原文地址: https://ju.6miu.com/read-33838.html

    最新回复(0)