同步后的Java并发修改异常

时间:2012-12-04 02:49:24

标签: java iterator linked-list synchronized

我有一个试图迭代的对象的链接列表(使用迭代器),看看它们是否有任何冲突,如果有,请将其从列表中删除。但是,我得到一个并发修改异常。我把它放在一个synchronized块中,我也尝试在try catch块中捕获错误,似乎都没有帮助,代码在这里:

private void updateTP() {
    synchronized (toiletpaper) {
        Iterator<ToiletPaper> iter = toiletpaper.iterator();
        while (iter.hasNext()) {
            ToiletPaper tp = iter.next();
            tp.update(1000, 700);
            if (toilet.overlaps(tp)) {
                System.out.println("tp splash!");
                toiletpaper.remove(tp);
                menu.removeLife();
            }
        }
    }
}

对这个问题的任何想法都会受到赞赏,我通过这里和google查看,并且所有人都说要么抓住异常或同步它,这似乎都不起作用......请帮忙。

3 个答案:

答案 0 :(得分:4)

要避免异常,请改用iter.remove()。这将通过迭代器实例删除元素,而不是当前调用,它单独搜索和从列表中删除 - 即并发修改。

答案 1 :(得分:2)

它正在抛出异常,因为您正在使用toiletpaper.remove(tp);直接修改集合。在迭代它时,你必须使用iter.remove()修改集合。

答案 2 :(得分:2)

当您执行toiletpaper.remove(tp)时,您修改了链接列表(重新链接它),因此您会收到该错误;你的迭代器不再有效。