Kotlin协程&发生在&保证之前? [英] Kotlin coroutines "happens-before" guarantees?
本文介绍了Kotlin协程&发生在&保证之前?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Kotlin协程是否提供任何"发生在之前"的保证?
例如,在这种情况下,在对mutableVar
的写入和对其他线程的后续读取(可能)之间是否有"在此之前发生"的保证:
suspend fun doSomething() {
var mutableVar = 0
withContext(Dispatchers.IO) {
mutableVar = 1
}
System.out.println("value: $mutableVar")
}
编辑:
也许额外的例子会更好地阐明这个问题,因为它更像是Kotlin式的(除了易变性)。此代码是线程安全的吗:
suspend fun doSomething() {
var data = withContext(Dispatchers.IO) {
Data(1)
}
System.out.println("value: ${data.data}")
}
private data class Data(var data: Int)
推荐答案
您编写的代码有三个共享状态访问权限:
var mutableVar = 0 // access 1, init
withContext(Dispatchers.IO) {
mutableVar = 1 // access 2, write
}
System.out.println("value: $mutableVar") // access 3, read
这三个访问是严格按顺序排序的,它们之间没有并发,您可以放心,Kotlin的基础设施负责在移交到IO
线程池并返回到您的调用协程时建立发生在之前的边缘。
这里有一个等效的例子,可能看起来更有说服力:
launch(Dispatchers.Default) {
var mutableVar = 0 // 1
delay(1)
mutableVar = 1 // 2
delay(1)
println("value: $mutableVar") // 3
}
因为delay
是一个可挂起的函数,而且我们使用的是由线程池支持的Default
调度程序,所以第1、2和3行可能分别在不同的线程上执行。因此,您关于发生在保证之前的问题同样适用于此示例。另一方面,在这种情况下,很明显(我希望)这段代码的行为符合顺序执行的原则。
这篇关于Kotlin协程&发生在&保证之前?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文