Ответ 1
Если вы посмотрите на сам байт-код без его декомпиляции, вы увидите, что синхронизация происходит так, как должна - это версия, лишенная множества операций загрузки и хранения, номеров строк и т.д., Но важно то, где 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.