为什么这段代码会在Java中引发ConcurrentModificationException异常?

3
为什么这段代码会在Java中引发ConcurrentModificationException异常?
public class MainMenuState {
    protected void init() {
        this.addElements(
             new GUIElement()
             .addMousePressed((e, element) -> {
                   this.elements.add(new GUIElement()
                   .addMouseEntered((e, element) -> //...)
             }
        )
   );
}

addElements 的定义如下:

void addElements(GameElement... elements){
    this.elements.addAll(Arrays.asList(elements));
}

当我点击包含的GUI元素时,我希望代码创建另一个GUI元素并将其添加到列表elements中。但实际上,当我点击它时,会抛出ConcurrentModificationException异常。
我知道当在向列表添加元素时修改列表时会抛出ConcurrentModificationException异常,但是mouseEntered方法直到elements被修改后才被调用。
那么这个错误是怎么发生的呢?
错误文本:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at java.lang.Iterable.forEach(Unknown Source)
at code.state.GameState.render(GameState.java:34)
at code.state.Handler.render(Handler.java:32)
at code.state.Handler.render(Handler.java:28)
at code.frame.GameEngine.render(GameEngine.java:94)
at code.frame.GameEngine.run(GameEngine.java:68)
at java.lang.Thread.run(Unknown Source)
2个回答

5
我认为这里没有足够的上下文来准确定位您的问题的确切原因。但是一个解决方案就是简单地使用:
```html

我不认为这里有足够的上下文来准确定位您的问题的确切原因。但是一个解决方案就是简单地使用:

```
 List<Object> objList = Collections.synchronizedList(new ArrayList<Object>());

为了实例化问题列表并简单同步访问它。

4

我假设你正在code.frame.GameEngine.render()方法中将某些内容渲染到屏幕上。问题在于,你正在使用一个不安全的LinkedList。因此,在code.frame.GameEngine.render()方法迭代elements时(这是异步发生的),可能会向elements中添加新的GUIElement。你需要使用线程安全的集合,例如:

List<GUIElement> elements = Collections.synchronizedList(new LinkedList<GUIElement>());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接