Kotlin:跳过协同程序

时间:2017-09-16 23:10:19

标签: android kotlin coroutine

我在我的演示安卓应用程序中使用Kotlin和Coroutines。

这就是我所拥有的:

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个Coroutines的列表,等待1秒并打印一个数字然后递增它。

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

(此演示来自GitHub Documentation

现在我的大多数测试运行正常,所有协同程序几乎同时运行,我的最终结果是10000

Log showing Final Result = 10,000

然而,在极少数情况下,我的最终结果为9,999

Log showing Final Result = 9,999

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

Log showing Final Result = 49,998

Kotlin是否有可能在有很多协同程序的情况下跳过某些协同程序?在50,000,看起来它跳过2

或者其他事情发生在这里?

1 个答案:

答案 0 :(得分:3)

num++包含两项操作:tmp = num + 1num = tmp。在处理像你的例子这样的多线程时,有些操作可能会覆盖另一个线程的结果,导致像你的例子一样。

如果你想了解更多,研究“竞争条件”,最终结果取决于两个独立过程之间的“竞争”。