我知道 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 上一样?我认为这将有助于确保平台的一致性。