Iterator.next()上的ConcurrentModificationException

时间:2013-04-26 21:35:48

标签: java multithreading

我在以下代码中收到ConcurrentModificationException:

private static List<Task> tasks = new LinkedList<Task>();
...
public void doTasks(){
    synchronized(tasks){
        Iterator<Task> it = tasks.iterator();

        while(it.hasNext()){
            Task t = it.next(); < Exception is always thrown on this line.

            if(t.isDone()){
                it.remove();
            } else {
                t.run();
            }
        }
    }
}
...
public void addTask(Task t){
    synchronized(tasks){
        tasks.add(t);
    }
}
...
public void clearTasks(){
    synchronized(tasks){
        tasks.clear();
    }
}

对象“任务”不会在类中的任何其他位置使用。我不知道为什么我会得到例外。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

这是你的问题:

if(t.isDone()){
    ...
} else {
    t.run(); // probably changing the task, so consequently the list tasks
}

编辑:您无法更改循环中的tasks列表。查看ConcurrentModificationException documentation了解更多详情。

干杯!

答案 1 :(得分:1)

发现错误!我忘记了在doTask()中运行任务的场景实际上可以调用addTask()。但是我有点困惑,为什么会发生这种情况,因为我认为“任务”对象会被doTask()函数锁定。