【问题标题】:strange error in android java.util.ConcurrentModificationExceptionandroid java.util.ConcurrentModificationException 中的奇怪错误
【发布时间】:2016-10-27 05:30:33
【问题描述】:

大家好,我有一个小问题。我正在为 android 编写一个应用程序,我的部分代码是这样的。

public void loop(){

   for(Car car:carList)
        car.run();

}

我收到错误 java.util.ConcurrentModificationException 我还尝试使用迭代器来快速解决问题。 另外,我使用 synchronized 因为我检查了 oracle 文档中的错误,它说这可能是由许多线程使用相同的代码引起的。

public synchronized void loop(){
 Iterator<Car> carIterator = carList.iterator();
 while(cardIterator.hasNext()){
  carIterator.next().run();
 }
}

我真的不知道为什么我找到的任何解决方案都不起作用。大多数情况下,我在后台服务中使用这部分代码,并且我也在活动中使用包含该方法(使用单例)的类。 在此先感谢所有社区


感谢大家的支持, -carList 是 Car 对象的 ArrayList。 我的车课是这样的

public class Car{
   private int mSpeed;
   private int mDistance; //zero at first
    ........
   public void run(){
       mSpeed=getRandomSpeed();
       mDistance+=mSpeed;
       updateDistanceInDB();//here I sabe the distance in DB using a DB helper
   }
   .........   

}

-错误表示在执行run方法的那一行产生 有点奇怪,因为该应用在我拥有的另一台设备上运行良好。

【问题讨论】:

  • 我们能看到Car#run()的代码吗?您还应该告诉我们carList 是什么
  • 是否可以从其他线程访问carList?还是car.run() 碰巧修改了carList?
  • java.util.ConcurrentModificationException 当您尝试修改集合对象并同时循环遍历它时出现。您可能需要在循环之前将 carList 复制到其他列表。
  • 检查here和here
  • 规则 #0:当询问有关异常的问题时,您必须发布完整的堆栈跟踪并确定代码中导致异常的行。

标签: java android multithreading arraylist


【解决方案1】:

解决此异常的最暴力方法是使用CopyOnWriteArrayList 代替您当前的List。这将确保在 for-each 循环期间对列表的任何更新都不会在迭代期间被看到,因此不会抛出 ConcurrentModificationException。

根据其文档:

“快照”样式的迭代器方法使用对创建迭代器时数组状态的引用。该数组在迭代器的生命周期内永远不会改变,因此不可能发生干扰,保证迭代器不会抛出ConcurrentModificationException。

但是,根据具体情况,可能会有更好的方法来解决您的问题。查看代码的哪些部分对List 进行了修改,并确保它们不会在迭代期间运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多