0

我知道 Kotlin/Native 关于线程之间对象的可变性有非常具体的规则。

然而令我惊讶的是,我发现从 commonMain(部署到 androidTestDebug)运行单元测试时,我能够更改不同线程上的可变状态。例如,这在更改中的值时可以正常工作MyData

data class MyData(var value : Int = 0)

suspend fun main() = coroutineScope {
  val myData = MyData()
  val newContext1 = newSingleThreadContext("contextOne")
  val newContext2 = newSingleThreadContext("contextTwo")

  launch (newContext1) {
    myData.value = 1
  }
  launch (newContext2) {
    myData.value = 2
  }
}

但是,如果我在针对 iOS 时运行它,它会崩溃,给我kotlin.native.concurrent.InvalidMutabilityException. 这是我期望在两个平台上发生的事情。我是 KMM 的新手,但为什么在 JVM 上运行 commonMain 代码时不强制执行并发可变性规则

还有一种方法可以在 JVM 上强制执行可变性规则,以便测试在 Android 上失败,就像在 iOS 上一样?我认为这将有助于确保平台的一致性。

4

1 回答 1

2

不,它不应该在 Android 上崩溃。

Kotlin native 从 Kotlin 创建 Native 代码,这就是为什么需要它自己的并发模型。

对于 android 部分,这是普通的 kotlin 代码,因此可以使用 JVM 并发模型,并且与任何其他改变变量的 kotlin 代码一样,它不应该崩溃。

我认为没有办法让它在 Android 上崩溃。

在 kotlin 1.6.0 中,这应该被改变,所以这段代码不会在两个平台上崩溃

于 2021-09-23T22:30:00.233 回答