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)
withContext
中创建的对象,而第一个例子则是先创建对象,在withContext
内进行修改,然后在withContext
之后进行读取。因此,第一个例子涉及到更多的线程安全特性。 - Marko TopolnikwithContext
只是在不同的上下文中继续执行相同的协程)。因此,你所练习的仅仅是程序顺序一致性。现在,有两个问题:1. Kotlin协程是否保证程序顺序一致性?2. 实际实现是否遵守该保证?我不确定你对这两个问题中的哪一个持怀疑态度。 - Marko Topolnik