Kotlin:跳过协程

Kotlin: Skipping Coroutines

我在演示 android 应用程序中使用了 Kotlin 和协程。

这是我拥有的:

fun testCoroutine3() = runBlocking {
    var num = 0
    val jobs = List(10_000) { // create a lot of coroutines and list their jobs.
        launch(CommonPool) {
            delay(1000L)
            println(num++)
        }
    }

    for(job in jobs) {
        job.join() //wait for all jobs to finish
    }
    println("FINAL RESULT $num")
}

基本上我正在创建一个包含 10,000 个协程的列表,它们等待 1 秒并打印一个数字然后递增它。

然后当所有作业完成后,我打印最终结果。

(此demo摘自GitHub Documentation)

现在我的大部分测试运行都很好,所有协程运行几乎同时进行,我的最终结果是10000

但是在极少数情况下,我得到的最终结果是 9,999

例如,当我将数字增加到 50,000 时,这变得更加明显:

当协程很多时,Kotlin 是否可能会跳过一些协程?在 50,000 上,看起来它跳过了 2

还是这里发生了其他事情?

num++ 由两个操作组成:tmp = num + 1num = tmp。在处理像您的示例这样的多线程时,某些操作可能会覆盖另一个线程的结果,从而导致出现像您的示例这样的情况。

如果您想了解更多信息,请研究 "race conditions" 最终结果取决于两个独立进程之间的 "race"。