并发修改例外

时间:2014-02-08 23:43:45

标签: java data-structures collections concurrentmodification

我正在尝试制作一个漂浮在屏幕上的小行星对象的小程序。如果两颗小行星碰撞,那么速度较慢的小行星应该分解成两颗较小的小行星。一旦小行星的大小为1,它就会消失。

当我尝试比较两个小行星时,我得到一个ConcurrentModificationException,我不知道为什么。

private volatile Collection<Asteroid> belt;
private void handleCollisions() {


    Collection<Asteroid> psuedoBelt = belt;
    Iterator<Asteroid> one;
    Iterator<Asteroid> two;

    for (one = psuedoBelt.iterator(); one.hasNext();) {
        Asteroid aOne = one.next();
        for (two = psuedoBelt.iterator(); two.hasNext();) {

            Asteroid aTwo = two.next();
            if (aOne.collidesWith(aTwo)) {
                if (aOne.getSpeed() > aTwo.getSpeed()) {
                    Collection<Asteroid> split = aTwo.split();
                    two.remove();
                    for (Iterator<Asteroid> three = split.iterator(); three
                            .hasNext();) {
                        psuedoBelt.add(three.next());
                    }
                } else {
                    Collection<Asteroid> split = aOne.split();
                    one.remove();
                    for (Iterator<Asteroid> three = split.iterator(); three
                            .hasNext();) {
                        psuedoBelt.add(three.next());
                    }
                }
            }
        }
    }

    belt = psuedoBelt;

}

1 个答案:

答案 0 :(得分:1)

首先,创建一个迭代器:

for (one = psuedoBelt.iterator(); one.hasNext();) {

然后,第二个,在同一个集合上:

    for (two = psuedoBelt.iterator(); two.hasNext();) {

然后,使用第二个迭代器删除项目:

    two.remove();

问题是,当您从集合中删除该项时,第一个迭代器(one)不知道此删除。

因此,在one.next()上,它检测到集合已被修改并引发此异常。

有两种解决方案:

  • 尝试仅使用一个迭代器或
  • 保留要删除的项目列表,并在迭代收集后删除它们。