【发布时间】: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