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所以这个代码不会在两个平台上崩溃
我知道 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所以这个代码不会在两个平台上崩溃