首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >kotlin,为什么反编译的java代码会将同步锁块转换为同步(Var1){}+代码块?

kotlin,为什么反编译的java代码会将同步锁块转换为同步(Var1){}+代码块?
EN

Stack Overflow用户
提问于 2019-04-19 04:18:33
回答 1查看 122关注 0票数 -1

在kotlin中,有同步块

代码语言:javascript
复制
synchronized(_lock) {
  // code do something
}

它的意思是释放锁,直到所有// code fo something完成。

但是在反编译的java代码中,同步(锁)块被放在代码块之外。

代码语言:javascript
复制
Object var1 = this._lock;
synchronized(var1){}
// code do something

,这是否意味着锁将被过早释放,以至于// code fo something可能仍在运行?

kotlin代码:

代码语言:javascript
复制
override fun doSomething(): Boolean {
  synchronized(_lock) {

     //......


     lastCompleteAt = Date().time + REQUEST_THROTTLE_TIME

     for ((_, handler) in dataRequestMap) {

        //......
     }
     return true
  }
   }

反编译成java代码:

代码语言:javascript
复制
public boolean doSomething() {

  Object var1 = this._lock;
  synchronized(var1){}

  boolean var7;
  try {
     //......


     this.lastCompleteAt = (new Date()).getTime() + 5000L;
     Map var3 = (Map)this.dataRequestMap;
     Iterator var4 = var3.entrySet().iterator();

     while(var4.hasNext()) {

        //......
     }

     //......
     var7 = true;
  } finally {
     ;
  }

  return var7;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-19 05:52:08

我相信@tkausl is correct是因为你的反编译器不正确地反编译了代码。如果您检查由以下项生成的字节代码:

代码语言:javascript
复制
fun main() {
    val lock = Any()
    synchronized(lock) {
        println("Hello, World!")
    }
}

您将看到:

代码语言:javascript
复制
Compiled from "Main.kt"
public final class MainKt {
  public static final void main();
    Code:
       0: new           #4                  // class java/lang/Object
       3: dup
       4: invokespecial #12                 // Method java/lang/Object."<init>":()V
       7: astore_0
       8: iconst_0
       9: istore_1
      10: iconst_0
      11: istore_2
      12: aload_0
      13: monitorenter
      14: nop
      15: iconst_0
      16: istore_3
      17: ldc           #14                 // String Hello, World!
      19: astore        4
      21: iconst_0
      22: istore        5
      24: getstatic     #20                 // Field java/lang/System.out:Ljava/io/PrintStream;
      27: aload         4
      29: invokevirtual #26                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      32: getstatic     #32                 // Field kotlin/Unit.INSTANCE:Lkotlin/Unit;
      35: astore_2
      36: aload_0
      37: monitorexit
      38: goto          46
      41: astore_2
      42: aload_0
      43: monitorexit
      44: aload_2
      45: athrow
      46: return
    Exception table:
       from    to  target type
          14    36    41   any
          41    42    41   any

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #9                  // Method main:()V
       3: return
}

如果您注意到了,在println("Hello, World")语句(29)之前有一个"monitorenter“命令(13),后面是一个"monitorexit”命令(37)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55753191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档