ConcurrentModificationExample和可能的代码简化

时间:2014-05-08 23:21:05

标签: java linked-list

我在以下代码中抛出ConcurrentModificationExample。我检查了API,它与我一起尝试修改一个对象,而另一个线程正在迭代它。我对此事毫无头绪。我在导致异常的行上方创建了一条注释。 Employee类不包含除存储信息的三个变量之外的任何内容。

我将包括整个类,因为我还想知道是否有一种简化代码的方法,因为它重复了许多事情,例如创建对象并将所有内容添加到列表中。

2 个答案:

答案 0 :(得分:0)

您尝试做的事情与此类似......

List list = ...;
for(item: list) {
    list.add(item);
}

也就是说,您通过迭代同一个集合来更新包含元素的集合。所有

outputList.add(...);
部门的

正在从同一个集合' employees'中添加元素。 在main()中,通过执行

dep.employeesByAge(dep.employees)

您正试图更新' dep.employees'与' dep.employees。'这会导致并发修改异常。

答案 1 :(得分:0)

当您使用dep.employees:

在此处调用employeesByAge时
dep.employeesByAge(dep.employees)

将dep.employees传递给employeesByAge,以便:

public class Department{
    LinkedList<Employee> employees = ...;
    public LinkedList<Employee> employeesByAge(LinkedList<Employee> outputList) {
        ...
    }
}

employee成员字段和outputList参数都引用相同的列表,而不仅仅是具有相同内容但具有相同列表实例的两个列表。

然后你做:

for (Employee emp: employees){
    //the list is null. add the first employee

    if (outputList.isEmpty()){
        outputList.add(emp);
    } else
    ...
}

迭代员工并修改outputList,但请记住这两个是相同的列表对象。因此,ConcurrentModificationException。