【发布时间】:2020-02-09 14:33:10
【问题描述】:
想知道是否有人可以提供帮助,我正在尝试了解在 Kotlin 中使用两个线程访问集合的正确方法。
下面的代码模拟了我在实时系统中遇到的问题。一个线程遍历集合,但另一个线程可以删除该数组中的元素。
我已尝试将 @synchronized 添加到集合 getter,但这仍然给我一个并发修改异常。
谁能告诉我正确的做法是什么?
class ListTest() {
val myList = mutableListOf<String>()
@Synchronized
get() = field
init {
repeat(10000) {
myList.add("stuff: $it")
}
}
}
fun main() = runBlocking<Unit> {
val listTest = ListTest()
launch(Dispatchers.Default) {
delay(1L)
listTest.myList.remove("stuff: 54")
}
launch {
listTest.myList.forEach { println(it) }
}
}
【问题讨论】:
-
你应该避免像这样共享可变状态。你真正想解决什么问题?也许你正在寻找一个«演员»?
-
即使同步访问列表,
forEach隐式创建的迭代器在调用remove后也会失效。
标签: kotlin concurrency synchronized