Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 这是Kotlin的bug还是我遗漏了什么?_Multithreading_Kotlin - Fatal编程技术网

Multithreading 这是Kotlin的bug还是我遗漏了什么?

Multithreading 这是Kotlin的bug还是我遗漏了什么?,multithreading,kotlin,Multithreading,Kotlin,我在多线程方面没有太多经验。因此,我不确定我是否正确使用了从Kotlin反编译的以下Java代码 以下是Kotlin代码: companion object { @Volatile private var INSTANCE: SomeDatabase? = null fun getInstance(context: Context): SomeDatabase = INSTANCE ?: synchronized(this) {

我在多线程方面没有太多经验。因此,我不确定我是否正确使用了从Kotlin反编译的以下Java代码

以下是Kotlin代码:

companion object {
    @Volatile private var INSTANCE: SomeDatabase? = null

    fun getInstance(context: Context): SomeDatabase =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
            }
}
以下是Java中的反编译代码:

     SomeDatabase var10000 = ((SomeDatabase.Companion)this).getINSTANCE();
     if (var10000 == null) {
        synchronized(this){}

        SomeDatabase var4;
        try {
           var10000 = SomeDatabase.Companion.getINSTANCE();
           if (var10000 == null) {

               ...

        var10000 = var4;
     }

     return var10000;

这是否意味着代码实际上没有同步,因为
synchronized(this){}
中的空块?

如果您查看字节码本身而没有对其进行反编译,您将看到同步按其应该的方式进行-这是一个没有大量加载和存储操作、行号等的版本。,但重要的是
MONITORENTER
MONITOREXIT
指令的位置:

public final getInstance(Landroid/content/Context;)Lcom/example/SomeDatabase;
    LDC "context"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
    INVOKESTATIC com/example/Foo.access$getINSTANCE$cp ()Lcom/example/SomeDatabase;
    MONITORENTER
    INVOKESTATIC com/example/Foo.access$getINSTANCE$cp ()Lcom/example/SomeDatabase;
    INVOKESTATIC com/example/FooKt.buildDatabase (Landroid/content/Context;)Lcom/example/SomeDatabase;
    INVOKESTATIC com/example/Foo.access$setINSTANCE$cp (Lcom/example/SomeDatabase;)V
    MONITOREXIT
    MONITOREXIT
    ARETURN

您看到的问题不是编译器中的错误,而是反编译器的问题,这并不罕见。将任意生成的字节码反编译回Java是一个相当大的挑战。

您有两次
MONITOREXIT
。这是偶然的吗?它在字节码中出现了两次-我现在记不清了,也没有这个项目在我面前,但我相信它是针对猫王运营商的两个不同的返回分支。啊,好的。所以在它们之间一定有
ARETURN
GOTO
或其他什么东西。是的,我很确定是这样的,我只是删去了很多说明来关注这些。