java.util.ConcurrentModificationException 用于在没有循环的情况下删除

问题描述 投票:0回答:1

我正在使用一个

MutableMap
集合,其中
set
作为值,我需要经常添加新对象并删除一些旧对象。我不使用循环,但由于某种原因我仍然得到一个
java.util.ConcurrentModificationException
。请帮忙,我的主要错误是什么?

收藏:

val userIdToSessionDataMap: MutableMap<String, MutableSet<UserSessionData>> = mutableMapOf()

移除物体的方法:

private fun removeDataForUser(userId: String, jti: String) {
    val found = userIdToSessionDataMap[userId]
    found?.remove(found.find { it.jti == jti })
}

例外:

java.util.ConcurrentModificationException: null
    at java.base/java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:756)
    at java.base/java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:778)
    at com.life.application.service.BroadcastServiceImpl.removeSessionForUser(BroadcastService.kt:57)
kotlin concurrency sse
1个回答
0
投票

如果您正确查看代码,您会尝试同时读取和写入

MutableMap
。您在以下代码中使用
remove
(WRITE)和
find
(READ)函数会导致并发修改,即同时进行,这是像
MutableMap

这样的数据结构所不允许的
found?.remove(found.find { it.jti == jti })

您可以使用 JVM Collections 接口中可用的

Iterator
对象,或者如果您想要更多 Kotlin 的做事方式,您可以使用
removeIf
方法,如下所示

found.entries.removeIf{ it.jti == jti }

还有一些其他选项,例如使用“标记”和“删除”,可以在此处

找到
© www.soinside.com 2019 - 2024. All rights reserved.