我在我的演示安卓应用程序中使用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
然而,在极少数情况下,我的最终结果为9,999
当我将数字增加到50,000时,这变得更加明显,例如:
Kotlin是否有可能在有很多协同程序的情况下跳过某些协同程序?在50,000,看起来它跳过2
或者其他事情发生在这里?
答案 0 :(得分:3)
num++
包含两项操作:tmp = num + 1
和num = tmp
。在处理像你的例子这样的多线程时,有些操作可能会覆盖另一个线程的结果,导致像你的例子一样。
如果你想了解更多,研究“竞争条件”,最终结果取决于两个独立过程之间的“竞争”。