【问题标题】:Kotlin Multiplatform concurrent mutability iOS vs AndroidKotlin 多平台并发可变性 iOS vs Android
【发布时间】:2021-09-23 20:37:51
【问题描述】:

我知道 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 上运行 commonMain 代码时不强制执行并发可变性规则

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

【问题讨论】:

    标签: kotlin-multiplatform kotlin-multiplatform-mobile


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多