您的位置:首页 > 编程语言 > Java开发

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

2017-03-12 15:54 591 查看
在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                             //
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: