我正在使用一个
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)
如果您正确查看代码,您会尝试同时读取和写入
MutableMap
。您在以下代码中使用 remove
(WRITE)和 find
(READ)函数会导致并发修改,即同时进行,这是像 MutableMap
这样的数据结构所不允许的
found?.remove(found.find { it.jti == jti })
您可以使用 JVM Collections
接口中可用的
Iterator对象,或者如果您想要更多 Kotlin 的做事方式,您可以使用
removeIf
方法,如下所示
found.entries.removeIf{ it.jti == jti }
还有一些其他选项,例如使用“标记”和“删除”,可以在此处
找到