首页 > 解决方案 > 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 的新手,请提出建议。

标签: androidkotlinkotlin-coroutines

解决方案


问题似乎存在于fun B(),您可能正在执行某种Collection类型的循环(sa List、Stack...),并且还删除/插入新元素到该 Collection 类型。

如果是这种情况,您应该使用Iterator循环,并且可以在迭代时删除/插入项目。但是,如果一个线程正在循环,而另一个线程正在插入/删除项目,则您需要同步对该 Collection 类型的访问(使用@Synchronized fun B()等...)。


推荐阅读