- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我搜索了 StackOverflow 并且有很多 ConcurrentModificationException 问题。读完之后,我还是一头雾水。我得到了很多这样的异常(exception)。我正在使用“注册表”设置来跟踪对象:
public class Registry {
public static ArrayList<Messages> messages = new ArrayList<Messages>();
public static ArrayList<Effect> effects = new ArrayList<Effect>();
public static ArrayList<Projectile> proj = new ArrayList<Projectile>();
/** Clears all arrays */
public static void recycle(){
messages.clear();
effects.clear();
proj.clear();
}
}
Registry.effects.add(obj)
和
Registry.effects.remove(obj)
//somewhere in my game..
boolean retry = true;
while (retry){
try {
removeEffectsWithSource("CHARGE");
retry = false;
}
catch (ConcurrentModificationException c){}
}
private void removeEffectsWithSource(String src) throws ConcurrentModificationException {
ListIterator<Effect> it = Registry.effects.listIterator();
while ( it.hasNext() ){
Effect f = it.next();
if ( f.Source.equals(src) ) {
f.unapplyEffects();
Registry.effects.remove(f);
}
}
}
drawProjectiles()
中不断收到 ConcurrentModificationExceptions方法,即使它没有修改任何内容。我想罪魁祸首是如果我触摸了屏幕,它会创建一个新的 Projectile 对象并将其添加到 Registry.proj 而 draw 方法仍在迭代。
ListIterator.remove()
它是从它正在迭代的 ArrayList 中删除该对象,还是只是从 Iterator 本身中删除它?
最佳答案
顶线,三个建议:
static
?) synchronized
或 ReadWriteLock
在封面下)public
字段是错误的:您的注册表应该向这些集合公开线程安全的行为访问器。例如,也许你想要一个
Registry.safeRemoveEffectBySource(String src)
方法。将线程细节保留在注册表内部,这似乎是您设计中此聚合信息的“所有者”。
List
语义,我建议将这些替换为
ConcurrentHashMaps
包裹到
Set
使用
Collections.newSetFromMap()
.
draw()
方法可以 a) 使用
Registry.getEffectsSnapshot()
返回集合快照的方法;或 b) 使用
Iterable<Effect> Registry.getEffects()
返回安全可迭代版本的方法(可能只是由
ConcurrentHashMap
支持,在任何情况下都不会抛出
CME
)。我认为 (b) 在这里更可取,只要绘制循环不需要修改集合。这在 mutator 线程和
draw()
之间提供了非常弱的同步保证。线程,但假设
draw()
线程运行得足够频繁,错过更新或其他可能没什么大不了的。
Iterator.remove()
删除该项目,但同样,您应该将此逻辑包装在
Registry
中如果可能的话,上课。在某些情况下,您需要锁定一个集合,对其进行迭代以收集一些聚合信息,并在迭代完成后进行结构修改。你问
remove()
方法只是将它从
Iterator
中删除或来自支持集合...参见
API contract for Iterator.remove()
它告诉您它从基础集合中删除对象。另见
SO question .
关于iterator - 另一个 ConcurrentModificationException 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4102850/
这个问题在这里已经有了答案: Why is a ConcurrentModificationException thrown and how to debug it (8 个答案) 关闭 3 年前。
这个问题已经有答案了: Concurrent Modification exception [duplicate] (9 个回答) 已关闭 8 年前。 在oldSet.removeAll(已删除);抛
这个问题在这里已经有了答案: Concurrent Modification exception [duplicate] (9 个回答) 关闭 9 年前。 我的程序抛出 ConcurrentModi
我有以下结构: public class Object1{ private HashMap myMap; ... public void cancelItem(Item o)
在本例中使用 list.remove((Object)93) 会导致 ConcurrentModificationException: List list = new ArrayList<>(); l
更新应用程序后,我收到来自 Firebase 的错误几乎在所有 Activity 中。 Fatal Exception: java.lang.RuntimeException: Unable to s
我有大量的东西,一个重复迭代它们的线程,以及一个偶尔删除或添加单个东西的单独线程。事物在同步链表中: private List things = Collections.synchronizedLis
在 DTO 中我有 public class ProductTypesDto extends BaseDto { private List colors = new ArrayList<>();
我正在创建一个 Swing 应用程序来制作游戏。它在屏幕外的随机位置创建图像,当它们离开屏幕时我想将它们删除。请看一下代码片段: public void checkTrolls(){ //CAUSES
我在向 Android 表插入数据时遇到问题。这是我的 Dao 函数: @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(frei
我有一个 Grails (2.4.3) 应用程序,它使用 PersistenceListener 来监听 GORM 事件。 PersistenceListener 工作正常。在 PreUpdate 事
基于 Spring Boot、spring-data-jpa 的大型 REST Web 应用程序。我有 PersonEntity ,它与 ParentEntity 具有 ManyToOne 关系。关系
我有一个作业要编写一个 Java 程序,该程序将读取上下文无关语法并返回所有非终结符的 FirstSet。我使用 FirstSet() 方法采用了递归方法: public static ArrayLi
我收到java.util.ConcurrentModificationException,但我不知道为什么。 在 Logcat 中,它指向此代码,但我没有看到任何可能导致 ConcurrentModi
我在以下情况下收到 ConcurrentModificationException 错误。线路发生这种情况的地方标有“ list = Collections.synchronizedList(them
自过去两个小时以来,我一直在尝试解决此异常..我得到了抛出异常的代码行..但没有找到解决方案..请帮助我发生错误@ mUsers.add(user);//在其他部分 private void read
我有以下代码: List list = getItems(); //where getItems() returns List do { list.add(ad
我得到ConcurrentModificationException当迭代 map 的内容时 for (String sourceKey : sMap.getContent().keySet(
代码是葡萄牙语的,对此我很抱歉。 我在这里读到另一个问题,因为我正在使用progSelecionada.remove(),所以抛出了异常,所以我更改为iterator.remove()但错误仍然存
我目前正在用 Java 编写多人游戏。我当前的代码(即出现错误)是这样的。 @Override public void onClose(WebSocket conn, int code, String
我是一名优秀的程序员,十分优秀!