【问题标题】:How to trace which HashMap throws ConcurrentModificationException如何跟踪哪个 HashMap 抛出 ConcurrentModificationException
【发布时间】:2016-06-29 09:04:51
【问题描述】:

在我的应用程序中,我有几个 HashMap。其中一个确实不时抛出 ConcurrentModificationException 。问题是我不知道如何跟踪实际上是哪个 Map 抛出它,以及 ConcurrentModification 何时发生。堆栈跟踪没有显示任何行号到它发生的位置。堆栈跟踪的开头如下所示:

java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806)
at java.util.HashMap$ValueIterator.next(HashMap.java:838)
at com.parse.ParseTraverser.traverseInternal(ParseTraverser.java:87)
at com.parse.ParseTraverser.traverse(ParseTraverser.java:137)
at com.parse.ParseObject.collectFetchedObjects(ParseObject.java:817)
at com.parse.ParseObject.access$700(ParseObject.java:49)
at com.parse.ParseObject$13.then(ParseObject.java:1487)
at com.parse.ParseObject$13.then(ParseObject.java:1484)
at bolts.Task$15.run(Task.java:917)
at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:105)
at bolts.Task.completeAfterTask(Task.java:908)
at bolts.Task.continueWithTask(Task.java:715)

【问题讨论】:

    标签: java android concurrency hashmap


    【解决方案1】:

    如果您无法评估哪个HashMap 被两个操作同时修改(经典示例是循环中的删除),您始终可以使用ConcurrentHashMap

    【讨论】:

    • 是的,我知道,但我仍然想弄清楚它是哪张地图,这样我就可以知道问题出在哪里。无论如何,ConcurrentHashMap 是否保证不会抛出 ConcurrentModificationException?我阅读了文档,并且在我的理解中它不应该发生,但是在我尝试使我的所有 hashMaps 并发(我想我得到了所有这些)之后,我有时仍然会收到这个错误。
    • 一个 ConcurrentHashMap 已同步,但不会因抛出任何 ConcurrentModificationException 而保存。 (如答案中所述:移除 f.e.)
    • 只要你不传递 ConcurrentHashMap 的迭代器(每个线程都使用它自己的迭代器),它应该是安全的。
    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多