Java 向LinkedList添加元素时并发修改错误

Java 向LinkedList添加元素时并发修改错误,java,Java,我有一个LinkedList对象列表 List<LinkedList<File1>> backup = new ArrayList<LinkedList<File1>>(); List backup=new ArrayList(); LinkedList包含一些元素。我需要通过单击按钮动态添加其他元素。在执行此操作时,我得到一个并发修改错误。我真的不明白为什么会出现这个错误。代码如下: private void jButton5Acti

我有一个LinkedList对象列表

    List<LinkedList<File1>> backup = new ArrayList<LinkedList<File1>>();
List backup=new ArrayList();
LinkedList包含一些元素。我需要通过单击按钮动态添加其他元素。在执行此操作时,我得到一个并发修改错误。我真的不明白为什么会出现这个错误。代码如下:

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt)      
{                                         
    // When JOIN button is clicked
    int parent_node,dist_node;
    // List<File1> temp_list = new ArrayList<File1>();
    File1 f_new = new File1();
    parent_node = Integer.parseInt(jTextField4.getText());
    dist_node = Integer.parseInt(jTextField5.getText());
    LinkedList<File1> tmp_bk = backup.get(parent_node);
    System.out.println("parent node : " + parent_node);
    System.out.println("dist node : " + dist_node);
    System.out.println("no of lists : " + backup.size());
    f_new.nod = backup.size();
    f_new.dist = dist_node;
    // temp_list.add(f_new);
    tmp_bk.add(f_new);

    ListIterator itr = it_bk.get(parent_node);
    while(itr.hasNext())
    {
        File1 f = (File1)itr.next();
        System.out.println("NODE : " + f.nod + "DIST : " + f.dist);
    }

}     
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt)
{                                         
//单击“加入”按钮时
int父节点,dist节点;
//List temp_List=new ArrayList();
File1 f_new=newfile1();
parent_node=Integer.parseInt(jTextField4.getText());
dist_node=Integer.parseInt(jTextField5.getText());
LinkedList tmp_bk=backup.get(父节点);
System.out.println(“父节点:“+父节点”);
System.out.println(“dist节点:“+dist\u节点”);
System.out.println(“列表数量:“+backup.size());
f_new.nod=backup.size();
f_new.dist=dist_节点;
//临时列表。添加(f_新建);
tmp_bk.添加(f_新增);
ListIterator itr=it_bk.get(父节点);
while(itr.hasNext())
{
file1f=(File1)itr.next();
系统输出打印项次(“节点:+f.nod+”距离:+f.DIST);
}
}     

这可能是因为您正在编辑列表,然后试图使用原始迭代器。集合API。编辑列表后,需要创建新的迭代器

例如,通常不允许一个线程在另一个线程迭代集合时修改集合。通常,在这些情况下,迭代的结果是未定义的。如果检测到此行为,某些迭代器实现(包括JRE提供的所有通用集合实现)可能会选择抛出此异常。这样做的迭代器称为fail-fast迭代器,因为它们快速、干净地失败,而不是在将来的不确定时间冒任意、不确定行为的风险

请注意,此异常并不总是表示对象被其他线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,该对象可能会引发此异常。例如,如果线程在使用fail fast迭代器迭代集合时直接修改集合,迭代器将抛出此异常。


这可能是因为您正在编辑列表,然后尝试使用原始迭代器。集合API。编辑列表后,需要创建新的迭代器

例如,通常不允许一个线程在另一个线程迭代集合时修改集合。通常,在这些情况下,迭代的结果是未定义的。如果检测到此行为,某些迭代器实现(包括JRE提供的所有通用集合实现)可能会选择抛出此异常。这样做的迭代器称为fail-fast迭代器,因为它们快速、干净地失败,而不是在将来的不确定时间冒任意、不确定行为的风险

请注意,此异常并不总是表示对象被其他线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,该对象可能会引发此异常。例如,如果线程在使用fail fast迭代器迭代集合时直接修改集合,迭代器将抛出此异常。


首先,如果你真的希望人们关注你的问题,你应该帮助他们用标准英语清楚地提问

其次,您应该提供在代码中获得ConcurrentModificationError的确切位置的指示

最后,什么是it_bk?它只是出现在代码中,没有任何解释。如果它是ListIterator的ArrayList,那么它的父节点第h个元素很可能处于不确定hasNext()或next()是否安全的状态。我猜你用tmp_bk.add(f_new)修改了底层集合所以一个预先存在的迭代器担心它的不变量可能被破坏


一般建议:不要创建和保留迭代器(或迭代器的集合)。当你想要一个迭代器时,创建它,使用它,然后放弃它。

首先,如果你真的希望人们关注你的问题,你应该帮助他们用标准英语清楚地提问

其次,您应该提供在代码中获得ConcurrentModificationError的确切位置的指示

最后,什么是it_bk?它只是出现在代码中,没有任何解释。如果它是ListIterator的ArrayList,那么它的父节点第h个元素很可能处于不确定hasNext()或next()是否安全的状态。我猜你用tmp_bk.add(f_new)修改了底层集合所以一个预先存在的迭代器担心它的不变量可能被破坏


一般建议:不要创建和保留迭代器(或迭代器的集合)。当您需要迭代器时,创建它,使用它,然后放弃它。

java.lang.JDK 1.5中的集合不同步。在早期版本(JDK1.4)中,您不会发现这个问题

这些问题有多种解决方案,您需要根据您的用例明智地选择其中一种

  • 解决方案1:可以使用list.toArray()将列表转换为数组,并在数组上迭代。如果列表较大,则不建议使用此方法

  • 回答2:整个列表可以锁定