【问题标题】:Synchronise function inside GlobalScope.launch(Main): KotlinGlobalScope.launch(Main) 中的同步函数:Kotlin
【发布时间】:2020-01-30 05:27:18
【问题描述】:

场景:让fun A()fun B() 成为两个函数。在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 的新手,请建议。

【问题讨论】:

标签: android kotlin kotlin-coroutines


【解决方案1】:

fun B() 中似乎存在问题,您可能会在某些 Collection 类型(s.a. List、Stack...)中执行循环并且还删除/插入新元素集合类型。

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

【讨论】:

  • favoriteContactsresult 是全局变量还是局部变量?看起来 Global 的某些东西被修改了(rankedEvents.favorites 等...)
猜你喜欢
  • 2019-07-17
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 2015-09-20
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
相关资源
最近更新 更多