Kotlin:跳过协程

我在演示Android应用程序中玩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") } 

基本上,我创建了1万个等待1秒的协程的列表,然后打印一个数字然后递增。

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

(这个演示取自GitHub文档 )

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

日志显示最终结果= 10,000

但在一些罕见的情况下,我得到的最终结果是9,999

日志显示最终结果= 9,999

例如,当我把这个数字增加到5万时,这变得更加明显:

日志显示最终结果= 49,998

Kotlin有很多可能跳过一些协同程序吗? 在5万,看起来像跳过了2

还是在这里发生了什么?

num++由两个操作组成: tmp = num + 1num = tmp 。 当像你的例子一样处理多线程时,有些情况下某些操作可能会覆盖另一个线程的结果,从而导致类似于你的例子的情况。

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