Kotlin协程中的可见性 [英] Visibility in Kotlin coroutines

查看:22
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆