【问题标题】:ConcurrentModificationException when using indexOf() in an ArrayList在 ArrayList 中使用 indexOf() 时出现 ConcurrentModificationException
【发布时间】:2020-09-08 21:43:42
【问题描述】:

当我只是迭代一个 ArrayList 并在循环中为我的应用程序逻辑使用 indexOf() 时,我得到了 ConcurrentModificationException。有人可以解释这背后的原因吗?从我读到的内容来看,如果我在仍在迭代时尝试向列表中添加/删除项目,应该会发生这种情况。我在这里错过了什么吗?

for (SomeClass c : listOfSomeClass)) {
            listOfSomeClass.indexOf(c);
        }

【问题讨论】:

  • indexOf无关。 listOfSomeClass 正在其他地方修改。
  • @AndyTurner 你的意思是其他线程?
  • 如果这就是循环体中的全部内容,是的,它必须是另一个线程。

标签: java exception arraylist concurrency


【解决方案1】:

您遇到了并发问题,而不是您这样做:

ArrayList<SomeClass> listOfSomeClass = new ArrayList<>();

尝试做:

CopyOnWriteArrayList<SomeClass> contas = new CopyOnWriteArrayList<>();

'CopyOnWriteArrayList' 是 java.util.ArrayList 的线程安全变体,其中所有可变操作(添加、设置等)都是通过制作底层数组的新副本来实现的。

这通常成本太高,但当遍历操作的数量远远超过突变时,它可能比其他方法更有效,并且在您不能或不想同步遍历但需要排除并发线程之间的干扰时很有用。

字体:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

还有其他选项可以解决您的问题,但我们需要查看您的所有代码以提供更好的帮助。

【讨论】:

    【解决方案2】:

    如果你想在遍历列表时删除或添加新项目,你应该使用ListIterator。这个代码

    package com.test.dal;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    
    public class LTest {
    
    
        public static void main(String[] args) {
            List<String> listOfSomeClass = new ArrayList<>();
            listOfSomeClass.add("1");
            listOfSomeClass.add("2");
            listOfSomeClass.add("3");
            listOfSomeClass.add("4");
            ListIterator<String> iterator = listOfSomeClass.listIterator();
    
            while (iterator.hasNext()) {
                String item = iterator.next();
                if (item.equals("2"))
                    iterator.remove();
                else if (item.equals("4"))
                    iterator.add("5");
            }
            System.out.println(listOfSomeClass);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2014-06-03
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 2012-04-06
      相关资源
      最近更新 更多