Kotlin协程&发生在&保证之前? [英] Kotlin coroutines "happens-before" guarantees?

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

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