Kotlin协程中的可见性 [英] Visibility in Kotlin coroutines
本文介绍了Kotlin协程中的可见性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我决定一头扎进Kotlin协程。我有一些关于能见度的问题。我理解,在没有ContinuationInterceptor
的情况下,相同协程的不同部分可能由不同的线程执行。
如何保证挂起后的新线程具有正确的协程内部状态可见性?
例如:
suspend fun doPost(customRatings : Map<String, Int>) : Int {...}
fun postRatings_1() {
GlobalScope.launch {
val mutableMap : MutableMap<String, Int> = mutableMapOf()
mutableMap["Apple"] = 1
mutableMap["Banana"] = 2
// ...
val postId = doPost(mutableMap)
// How am I guaranteed to see the two entries here ?
println("posted ${mutableMap} with id ${postId}")
}
}
启动新的协程时也是如此
fun postRatings_2() {
val mutableMap : MutableMap<String, Int> = mutableMapOf()
mutableMap["Apple"] = 1
mutableMap["Banana"] = 2
GlobalScope.launch {
// How am I guaranteed to see the two entries here ?
val postId = doPost(mutableMap)
//...
}
在这两种情况下,两个(现有)线程之间共享某种可变状态。
我正在寻找"发生在此之前"规则,该规则可确保两个线程正确地看到可变状态。
推荐答案
保证非常简单:例如,如果您的调度程序基于Java线程池,那么线程池本身就已经提供了这种保证。我正在寻找"发生在此之前"规则,该规则可确保两个线程正确地看到可变状态。
executor.submit()
调用之前的代码发生在提交的代码之前,而该代码又发生在观察关联的将来完成的代码之前。
即使您使用名为Dispatchers.Unconfined
的空调度程序,它只是在您碰巧调用continuation.resume(result)
的任何线程上恢复协程,您仍然会得到发生在之前,因为调用您的回调的底层框架保证了它。
您必须编写一个自定义中断的Dispatcher
实现才能扰乱排序。
这篇关于Kotlin协程中的可见性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文