我在 Kotlin 中学习协程,我有一段看起来像这样的代码(见下文)。
我的朋友说 mutableMapOf 是 LinkedHashMap,它不是线程安全的。论点是挂起函数可能由不同的线程运行,因此 LinkedHashMap 是不合适的。
- 在这里使用简单的可变映射是否安全,或者是否需要 ConcurrentMap?
- 当一个挂起函数被挂起时,它可以被另一个线程恢复并执行吗?
- 即使(2)是可能的,是否有“发生前/发生后”保证确保所有变量(和底层对象内容)在新线程接管之前与主内存深度同步?
这是代码的简化版本:
class CoroutineTest {
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
suspend fun simpleFunction(): MutableMap<Int,String> {
val myCallResults = mutableMapOf<Int,String>()
val deferredCallResult1 = scope.async {
//make rest call get string back
}
val deferredCallResult2 = scope.async {
//make rest call get string back
}
...
myCallResults.put( 1, deferredCallResult1.await() )
myCallResults.put( 2, deferredCallResult2.await() )
...
return myCallResults
}
}
提前致谢!
PS。我用更多的异步调用结果运行了这段代码,没有问题;所有通话结果都被考虑在内。但这可能是不确定的,这就是我问的原因。