问题标签 [concurrentmodificationexception]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
13 浏览

android - 避免 EnumMap 中的 ConcurrentModificationException 以性能和安全为重点的方法>

我目前有一个简单的事件调度程序逻辑,它使用以下与侦听器列表配对的事件列表示例:

它的作用如下:

  1. 对于每个EventKey表示应用程序内部的事件(可以是从NetworkDisconnectedto的任何IncorrectCredentials事件),如果该列表不为空,则该事件用于遍历其各自的事件侦听器列表,并将相应的事件调用分派给每个侦听器。

  2. listenerMap开始是空的,只有在添加了至少一个侦听器时才第一次填充每个侦听EventKeyEventKey,但是一旦在其中EventKey创建了条目,listenerMap它将不再被删除,只有它各自的侦听器列表将被改变(添加或删除的侦听器)。

  3. 我从不迭代列表,我只使用以下列表方法:List.addList.remove. 我知道在内部(android 源列表内部)可能会发生迭代,但那部分从未由我完成,也没有任何形式的迭代。我什至不使用List.contains.


我完全清楚,至少听众名单有风险ConcurrentModificationException,我已经能够触发。

我现在的问题是我很困惑哪种预防方法ConcurrentModificationException在确保它不会再次发生方面是最好的,并且在性能方面是最好的。

我有这个担心,因为这部分应用程序需要良好的性能。

以下是我在网上找到的与以下相关的解决方案的选项列表ConcurrentModificationException

  • 利用Collections.synchronizedMap(EnumMap<EventKey, MutableList<EventListener>>)
    • 当需要EnumMap<EventKey, MutableList<EventListener>>对 进行任何访问时,每次对listenerMapEnumMap
  • 利用Collections.synchronizedList(MutableList<EventListener>))
    • 读取列表或修改列表时,每次访问MutableList<EventListener>都通过此方法完成
  • 利用CopyOnWriteArrayList
    • 从我在网上找到的用户反馈来看,就性能而言,这似乎是一个非常昂贵的解决方案
  • 利用AtomicReference<MutableList<EventListener>>
    • 不太确定这个,但我看到了很多关于使用Atomic*代替使用的建议synchronized(*)
  • 使用synchronized(MutableList<EventListener>)/locks
    • 这是我想到的第一个,但我看到很多用户建议不要使用它,如果有其他更好的选择,比如使用Atomic*

现在我更倾向于使用Collections.synchronizedList,但我想知道是否有更好的方法来使用我所拥有的东西,只要ConcurrentModificationException安全包含,并且当前性能尽可能好。

此外,如果除了我上面列出的方法之外还有其他方法可以做到这一点,如果您认为它们优于那些方法,请随时提出建议。


笔记

请不要建议使用库来解决这个问题,这不是这个问题的目的。我知道周围有很多基于事件的调度库,这不是寻找最佳库的问题,而是寻找解决我问题的最佳方法。

0 投票
2 回答
138 浏览

java - 制作 .removeAll() 方法时出现 ConcurrentModificationException

我的代码看起来像这样

当我尝试运行它时 - 我看到:

当我尝试使用 base.removeAll(part) 时,我在这里看不到冲突。有人能帮助我吗?顺便说一句:saveBase() 只是将数据写入文本文件 UPD:Stacktrace

0 投票
2 回答
77 浏览

android - Kotlin list.map() 如何避免 ConcurrentModificationException

我有 ConcurrentModificationException 的问题。这是我的部分代码:

要清楚 - 我知道为什么会出现这个错误:) 问题是 - 我不知道解决方案是什么?我真的需要创建新的临时列表并将值放在那里吗?它只是没有意义:) 任何更好的选择,好吗?

编辑:

我将代码更改为以下:

但问题依然存在。

0 投票
1 回答
54 浏览

java - 从列表中删除项目时出现 ConcurrentModificationException

我有一个带有自定义列表类的应用程序。当尝试使用客户参数执行 foreach 函数时,会发生以下情况:

重要的!我无法修改 main 中的代码

主要的:

XList 类:

错误:

0 投票
2 回答
36 浏览

java - Java 同步集合——价值是什么?

以下代码非常非常快地触发了 ConcurrentModificationException:

...而以下行为应如此:

...我的理解是,同步集合是为了防止ConcurrentModificationExceptions 在这种情况下发生(但显然他们没有)。

鉴于此:我应该在哪里使用这些?

0 投票
0 回答
17 浏览

java - 尝试将实体添加到游戏时出现 ConcurrentModificationException

我正在用 Java 创建一个游戏,每当我击中时都会投下炸弹space

这是我修改列表的代码Handler.java

stillEntities是一个列表:

render()问题是当列表被修改时,我运行了显示游戏的方法:

第 21 行是我得到Exception in thread "Thread-0" java.util.ConcurrentModificationException. 我知道 Java 不允许在迭代时修改列表,但我还没有想出其他方法来将新实体 Bomb 添加到游戏中。我能做些什么来避免ConcurrentModificationException

0 投票
1 回答
33 浏览

java - 使用 Java 编辑 excel 文件时出错 (ConcurrentModificationException)

我正在尝试修改 excel 工作簿中任何单元格中与另一个值匹配的行的最后一个单元格。

在第一次迭代中它工作正常,但在第二次循环中,我在行java.util.ConcurrentModificationException中得到了这个错误 for (Cell cell : row) {

有谁知道我做错了什么?这是我根据这个答案使用的代码。

谢谢。

0 投票
1 回答
38 浏览

java - 使用缓存避免 Java 流上的 ConcurrentModificationException

我偶尔会收到ConcurrentModificationException以下代码:

我正在使用缓存转换为MyObject,但方法中似乎抛出了异常collect(DAOImpl.java 第 114 行)

如何使用缓存映射到对象,还是必须在流外使用缓存?

通知缓存应该每天只更新 1 次

0 投票
0 回答
11 浏览

swrl - Stardog 在使用 SWRL 规则对图进行合理查询时引发 ConcurrentModificationException

尝试在模型中执行带有推理的查询时,出现此错误:000012: com.complexible.stardog.plan.eval.operator.OperatorException: Uncaught error during query evaluation: ConcurrentModificationException

本体模型有 2 个 SWRL 规则并且是一致的,因为它在 Protege 中运行良好(带有内置的颗粒推理器)。模型已导入stardog rdf 模型和查询

失败并显示上述错误消息。

通过删除 SWRL 规则,查询运行良好,但模型当然不再代表所需的域。通过将 SWRL 规则翻译成 stardog 原生规则,错误再次出现。

推理级别设置为 DL,因为 SL 意味着目标应用程序的处理时间太长。更改推理选项中的 sameAs 标志不会改变行为。按照 Stardog 文档中的一般建议,将推理级别设置为 SL将解决此简化模型的问题,但如前所述,将导致在最终目标应用程序中使用不切实际。

您能帮我找出根本原因和可能的解决方案吗?有没有人在处理 SWRL 规则时遇到过同样的问题?

下面是海龟格式的相关模型,以便在测试图上轻松复制问题。

衷心感谢任何可以帮助我的人。

0 投票
2 回答
34 浏览

java - 遍历列表并添加到列表而不会引发 ConcurrentModificationException - Java

抱歉,这已经完成了,但我真的很难实现这个问题的解决方案,而且我对 Java 还是很陌生。

我需要能够调用一个基本上允许将 Person 对象添加到列表中的方法。该方法需要检查该人是否已经在列表中。它需要按名字执行检查 - 我知道实际上这看起来很愚蠢,但在这种特定情况下我需要能够做到这一点。

然后该列表需要对类可用,以便稍后可以调用 print list of names 方法。

我在尝试实施解决方案时遇到的主要问题是“ConcurrentModificationException”,这是可以理解的,因为我一直在尝试在每个循环的中间更新列表。

因此,我提出了以下解决方案来防止“ConcurrentModificationException”,但我的解决方案无法正常工作并且似乎过于复杂 - 请参阅以下方法代码片段:

因此,例如,如果我使用唯一和重复对象(aPerson 参数)的混合分别调用上述 addPerson 方法 4 次,则该方法正确识别那里已经有一个具有相同名字的对象,但人员列表似乎总是最终在那里有一个重复的对象(名字),例如,如果我有以下对象:

Person1 名字 = Bob

Person2 名字 = Jan

Person3 名字 = Bob

Person4 名字 = Ann

然后我分别调用以下方法 4 次:

addPerson(Person1);

addPerson(Person2);

addPerson(Person3);

addPerson(Person4);

当我调用打印方法时,我得到以下输出:

人 Bob 已在列表中输入

鲍勃

鲍勃

我期望以下内容:

人 Bob 已在列表中输入

鲍勃

为所有的华夫饼道歉,对你们大多数人来说,这可能是一个非常简单的解决方案,但我已经坚持了几天。如果有人可以根据我提供的示例提供一个简单的解决方案,将不胜感激?

可以在此处找到类似的文章,但我仍在苦苦挣扎。

在迭代期间向集合中添加元素