当前位置: 首页 > 面试题库 >

Guava MultiMap和ConcurrentModificationException [重复]

燕璞
2023-03-14
问题内容

我不明白为什么在遍历this时会收到ConcurrentModificationException
multimap。我阅读了以下条目,但是不确定我是否理解全部内容。我试图添加一个同步块。但是我的疑问是要与何时同步。

multimap是一个字段,这样创建的:

private Multimap<GenericEvent, Command> eventMultiMap =   
   Multimaps.synchronizedMultimap(HashMultimap.<GenericEvent, Command> create());

并像这样使用:

eventMultiMap.put(event, command);

就像这样(我试图在地图上同步这部分,但是没有成功)

for (Entry<GenericEvent, Command> entry : eventMultiMap.entries()) {
    if (entry.getValue().equals(command)) {
        eventMultiMap.remove(entry.getKey(), entry.getValue());
        nbRemoved++;
    }
}

问题答案:

java8中,您还可以使用lambda方法:

eventMultiMap.entries().removeIf(genericEventCommandEntry -> genericEventCommandEntry.getValue().equals(command));



 类似资料:
  • 问题内容: 我正在尝试按时间范围的开始时间排序列表(用开始时间和结束时间表示为Time []数组)。我正在尝试使用以下嵌套循环来做到这一点: 但它在行上抛出了一个(顶部的那个)。我以前从未见过这种例外情况,有人可以向我解释它的含义和原因。 我也愿意为此提出更好的算法建议。 问题答案: workingList.remove(compareTo); 您在迭代时正在修改集合。 您应该使用类似: 也有一些

  • 问题内容: 我有以下代码,我希望它抛出,但运行成功。为什么会这样? 问题答案: 的上方法删除指定位置的元素。在开始循环之前,您的列表如下所示: 然后,在列表上启动迭代器: 您的环然后删除 位置1处的元件 ,这是数字2: 在下一个隐式调用上,迭代器返回,然后循环终止。 如果将更多元素添加到列表中,则会得到一个。然后隐式将抛出。 请注意,从Javadoc 到JCF: 注意,迭代器的快速失败行为无法得到

  • 问题内容: 那是我收到的错误。 我的方法看起来像 所以我的理解是,这意味着我要在迭代器完成之前更改其大小,这就是您得到的错误。这是正确的,因为reactStateChange之一是用于将对象从hashMap中移除。如何安全地执行此操作,以便在删除某些内容时可以让Iterator提前知道,从而可以避免此错误。提前致谢。如果需要更多详细信息,我们将很高兴满足您的要求。 问题答案: 从基础集合中删除元素

  • 我有一个自定义列表类的应用程序。尝试使用customer参数执行foreach函数时,会发生以下情况: 重要!我不能修改主代码 主要内容: XList类: 错误:

  • 问题内容: 我有一个方法test(),其中我试图将两个LinkedHashMap相互比较,并通过删除键/值对(如果在两个LHM中都找到)来修改其中一个映射的内容。运行此方法时,我不断收到ConcurrentModificationException。我知道为什么会收到异常(因为我正在尝试修改正在循环的列表)。我不确定如何进行此操作。到目前为止,我有以下代码: 问题答案: 您可以使用迭代器:

  • 问题内容: 我正在使用以下代码测试集合: 我不明白为什么删除“ b”可以,但是其他NG? 问题答案: 首先要知道的是(如JLS所述)以下增强的for循环: 等效于: 如果查看中的迭代器的实现,您将看到: 不检查并发修改,仅使用大小检查我们是否在列表的末尾: 首先要做的是调用以查看在迭代过程中列表是否被修改: 因此,当您迭代并删除列表的倒数第二个元素时,下一条指令将是对的调用,该调用将返回,因为删除