Kotlin协程是否线程安全?示例代码安全性分析
这段代码是线程安全的
先看你给出的代码:
fun myFun() { GlobalScope.launch { val state = mutableSetOf<Int>() for(x in 1..100) { // do something delay(100) // update state after delay resume state.add(x) } } }
核心原因:
- 尽管
delay会让协程挂起,恢复时可能切换到Dispatchers.Default里的其他线程,但同一个协程的代码是串行执行的——同一时间只有一个线程在跑这个协程的逻辑,不会出现多个线程同时操作state的情况。 mutableSetOf<Int>本身不是线程安全集合,但它是当前协程的局部变量,仅被这一个协程持有和修改,没有其他协程或线程能同时访问它。- 循环中的每一次
state.add(x),都必须等前一轮循环的delay完成、协程恢复执行后才会触发,不存在并发修改的场景。
额外说明:
只有当state被暴露给其他协程或线程,或者被多个协程共享时,才会引发线程安全问题,但就当前给出的代码而言,不存在这类风险。
内容的提问来源于stack exchange,提问作者tiki taka
相关产品推荐
相关产品推荐

