在getter

时间:2017-02-28 15:37:10

标签: java list arraylist concurrency concurrentmodification

以下代码给出了ConcurrentModificationException,特别是转义的行,我想知道原因。 我发现当你在一个迭代器被引用后或两个线程同时访问列表时添加到一个列表时会发生这种情况。但是,我不认为在我的例子中就是这种情况。

我正在做的是将GameObjects列表作为参数传递:

camera.render(g, map.getGameObjectHandler().getGameObjects());

吸气剂:

    public ArrayList<GameObject> getGameObjects() {
//          if (player != null) {
//              gameObjects.add(player);
//          }
        return this.gameObjects;

我稍后在列表上进行迭代但不删除或添加任何内容。 我只使用Iterator访问每个元素。

我希望我提供了足够的信息,并且很乐意在需要时提供更多信息。

提前致谢。

//编辑:

我认为问题是每次调用getter时都会将播放器添加到列表中。我通过在生成时将播放器添加到列表中来修复它。 但我仍然想知道我做错了什么,因为这不是 问题的根源还是它?

//更新:

主循环看起来基本上是这样的:

map.update(); // iterating over the list and calling methods of objects in 
              // the list [running in main game thread]

repaint(); // calling paintComponentMethod where we pass our list as an 
           // argument so all its content can be drawn [running in event-
           // dispatch-thread !?]`

1 个答案:

答案 0 :(得分:0)

ArrayList上的ConcurrentModificationException可能在以下情况发生:

  • 代码的一部分是迭代和修改列表,
  • 有一些并发修改,例如添加/删除,而另一个线程在列表上进行迭代。