android - GlobalScope.launch(Main) 中的同步函数:Kotlin
问题描述
Scenerio: letfun A()
和fun B()
be 两个函数。在里面A()
我们调用B(
)。B()
执行时间大约需要 5 秒,同时其他一些线程再次调用 A(),然后我得到ConcurrentModificationException
.
fun A(){
GlobalScope.launch(Main) {
val result = withContext(IO) {
B()
}
if (this@activity.isValid()) {
suggestedFeedItems = result
} else {
}
}
}
fun B(){
//some code that takes some time to execute
}
如何同步它,以便一个线程一次可以执行 B()。我已经尝试使用@synchronise
. 作为 kotlin 的新手,请提出建议。
解决方案
问题似乎存在于fun B()
,您可能正在执行某种Collection
类型的循环(sa List、Stack...),并且还删除/插入新元素到该 Collection 类型。
如果是这种情况,您应该使用Iterator
循环,并且可以在迭代时删除/插入项目。但是,如果一个线程正在循环,而另一个线程正在插入/删除项目,则您需要同步对该 Collection 类型的访问(使用@Synchronized fun B()
等...)。