问题标签 [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.
android - 避免 EnumMap 中的 ConcurrentModificationException 以性能和安全为重点的方法>
我目前有一个简单的事件调度程序逻辑,它使用以下与侦听器列表配对的事件列表示例:
它的作用如下:
对于每个
EventKey
表示应用程序内部的事件(可以是从NetworkDisconnected
to的任何IncorrectCredentials
事件),如果该列表不为空,则该事件用于遍历其各自的事件侦听器列表,并将相应的事件调用分派给每个侦听器。listenerMap
开始是空的,只有在添加了至少一个侦听器时才第一次填充每个侦听EventKey
器EventKey
,但是一旦在其中EventKey
创建了条目,listenerMap
它将不再被删除,只有它各自的侦听器列表将被改变(添加或删除的侦听器)。我从不迭代列表,我只使用以下列表方法:
List.add
和List.remove
. 我知道在内部(android 源列表内部)可能会发生迭代,但那部分从未由我完成,也没有任何形式的迭代。我什至不使用List.contains
.
我完全清楚,至少听众名单有风险ConcurrentModificationException
,我已经能够触发。
我现在的问题是我很困惑哪种预防方法ConcurrentModificationException
在确保它不会再次发生方面是最好的,并且在性能方面是最好的。
我有这个担心,因为这部分应用程序需要良好的性能。
以下是我在网上找到的与以下相关的解决方案的选项列表ConcurrentModificationException
:
- 利用
Collections.synchronizedMap(EnumMap<EventKey, MutableList<EventListener>>)
- 当需要
EnumMap<EventKey, MutableList<EventListener>>
对 进行任何访问时,每次对listenerMap
EnumMap
- 当需要
- 利用
Collections.synchronizedList(MutableList<EventListener>))
- 读取列表或修改列表时,每次访问
MutableList<EventListener>
都通过此方法完成
- 读取列表或修改列表时,每次访问
- 利用
CopyOnWriteArrayList
- 从我在网上找到的用户反馈来看,就性能而言,这似乎是一个非常昂贵的解决方案
- 利用
AtomicReference<MutableList<EventListener>>
- 不太确定这个,但我看到了很多关于使用
Atomic*
代替使用的建议synchronized(*)
- 不太确定这个,但我看到了很多关于使用
- 使用
synchronized(MutableList<EventListener>)
/locks
- 这是我想到的第一个,但我看到很多用户建议不要使用它,如果有其他更好的选择,比如使用
Atomic*
- 这是我想到的第一个,但我看到很多用户建议不要使用它,如果有其他更好的选择,比如使用
现在我更倾向于使用Collections.synchronizedList
,但我想知道是否有更好的方法来使用我所拥有的东西,只要ConcurrentModificationException
安全包含,并且当前性能尽可能好。
此外,如果除了我上面列出的方法之外还有其他方法可以做到这一点,如果您认为它们优于那些方法,请随时提出建议。
笔记
请不要建议使用库来解决这个问题,这不是这个问题的目的。我知道周围有很多基于事件的调度库,这不是寻找最佳库的问题,而是寻找解决我问题的最佳方法。
java - 制作 .removeAll() 方法时出现 ConcurrentModificationException
我的代码看起来像这样
当我尝试运行它时 - 我看到:
当我尝试使用 base.removeAll(part) 时,我在这里看不到冲突。有人能帮助我吗?顺便说一句:saveBase() 只是将数据写入文本文件 UPD:Stacktrace
android - Kotlin list.map() 如何避免 ConcurrentModificationException
我有 ConcurrentModificationException 的问题。这是我的部分代码:
要清楚 - 我知道为什么会出现这个错误:) 问题是 - 我不知道解决方案是什么?我真的需要创建新的临时列表并将值放在那里吗?它只是没有意义:) 任何更好的选择,好吗?
编辑:
我将代码更改为以下:
但问题依然存在。
java - 从列表中删除项目时出现 ConcurrentModificationException
我有一个带有自定义列表类的应用程序。当尝试使用客户参数执行 foreach 函数时,会发生以下情况:
重要的!我无法修改 main 中的代码
主要的:
XList 类:
错误:
java - Java 同步集合——价值是什么?
以下代码非常非常快地触发了 ConcurrentModificationException:
...而以下行为应如此:
...我的理解是,同步集合是为了防止ConcurrentModificationException
s 在这种情况下发生(但显然他们没有)。
鉴于此:我应该在哪里使用这些?
java - 尝试将实体添加到游戏时出现 ConcurrentModificationException
我正在用 Java 创建一个游戏,每当我击中时都会投下炸弹space
:
这是我修改列表的代码Handler.java
:
stillEntities
是一个列表:
render()
问题是当列表被修改时,我运行了显示游戏的方法:
第 21 行是我得到Exception in thread "Thread-0" java.util.ConcurrentModificationException
. 我知道 Java 不允许在迭代时修改列表,但我还没有想出其他方法来将新实体 Bomb 添加到游戏中。我能做些什么来避免ConcurrentModificationException
?
java - 使用 Java 编辑 excel 文件时出错 (ConcurrentModificationException)
我正在尝试修改 excel 工作簿中任何单元格中与另一个值匹配的行的最后一个单元格。
在第一次迭代中它工作正常,但在第二次循环中,我在行java.util.ConcurrentModificationException
中得到了这个错误 for (Cell cell : row) {
。
有谁知道我做错了什么?这是我根据这个答案使用的代码。
谢谢。
java - 使用缓存避免 Java 流上的 ConcurrentModificationException
我偶尔会收到ConcurrentModificationException
以下代码:
我正在使用缓存转换为MyObject
,但方法中似乎抛出了异常collect
(DAOImpl.java 第 114 行)
如何使用缓存映射到对象,还是必须在流外使用缓存?
通知缓存应该每天只更新 1 次
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 规则时遇到过同样的问题?
下面是海龟格式的相关模型,以便在测试图上轻松复制问题。
衷心感谢任何可以帮助我的人。
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 已在列表中输入
简
安
鲍勃
为所有的华夫饼道歉,对你们大多数人来说,这可能是一个非常简单的解决方案,但我已经坚持了几天。如果有人可以根据我提供的示例提供一个简单的解决方案,将不胜感激?
可以在此处找到类似的文章,但我仍在苦苦挣扎。