Kotlin 多平台并发可变性 iOS 与 Android

Kotlin Multiplatform concurrent mutability iOS vs Android

我知道 Kotlin/Native 对于 mutability of objects between threads 有非常具体的规定。

然而令我惊讶的是,我发现当 运行从 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 上 运行ning commonMain 代码时不强制执行并发可变性规则?

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

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

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

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

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

在 kotlin 1.6.0 中这个should be changed所以这个代码不会在两个平台上崩溃