【问题标题】:ConcurrentModificationException in java [duplicate]java中的ConcurrentModificationException [重复]
【发布时间】:2013-06-04 14:49:20
【问题描述】:

编辑:问题已解决,确实来自子列表。谢谢!

我正在做一个关于遗传算法的项目。 但我有标题错误,我真的不知道它发生在哪里,所以我需要你的帮助......

这里是函数:

public synchronized void evolution(){
    //TreeSet containing the 2 fathers and children
    TreeChromosome t = new TreeChromosome();
    Chromosome father1 = selection();
    Chromosome father2;
    do{father2= selection();}
    while(father1==father2);

    t.add(father1);
    t.add(father2);


    Chromosome child1 = OperatorGen.crossRight(father1, father2);
    OperatorGen.swap(father1);

    Chromosome child2 = OperatorGen.crossLeft(father1, father2);        
    OperatorGen.swap(child2);

    t.add(fils1);
    t.add(fils2);

    // we add the best 2 in the population 
       Chromosome best1=t.pollFirst();
       genotype.add(best1);
        Chromosome best2=t.pollFirst();
       genotype.add(best2);

    //we remove the non selected chromosomes
    for (Chromosome chromo : t) {
        if (genotype.contains(chromo) && t.contains(chromo)){
            genotype.remove(chromo);
        }
    }
    genotype.updateRanks();
}

当我运行它时,它工作正常,但是当我在循环中运行它时,我在 OperatorGen.crossLeft 上有异常... 这是这个函数的代码:

public static Chromosome crossLeft(Chromosome father1, Chromosome father2, int joint){
    List<Ville> listFather1 = father1.getCities();
    List<Ville> listFather2 = pere2.getCities();
    //we copy the first cities of father1
    List<Ville> listChild= listPere1.subList(0, joint);
    City nextCity;
    //we add the cities of father2  
    //block where the error appears, not always at the same line

  for(int i=0;i<listFather2.size();i++){           
        nextCity=listFather2.get(i);

        if(!listChild.contains(nextCity)){
            listChild.add(nextCity);
        }
    }
    Chromosome child= new Chromosome(listChild);
    return child;
 }

我尝试在任何地方添加同步,但没有任何效果...所以我想知道问题出在哪里以及如何纠正它? 谢谢!

【问题讨论】:

  • 您的genotype-instance 声明在哪里?
  • 在包含第一个函数的类中:private static TreeChromosome genotype = new TreeChromosome();
  • 您必须提供完整的堆栈跟踪。还要指出行号所指的内容。

标签: java concurrentmodification


【解决方案1】:

您无法从当前正在迭代的集合中删除,除非您使用 Iterator.remove() 方法,该方法要求您不使用增强的 for 循环。

【讨论】:

  • 你确定是这样吗?他正在迭代 t,但从 genotype 中删除,据我了解,这是单独的实例。
【解决方案2】:

在您的代码中,您不断重复使用相同的城市以及相同的列表。当您使用 subList 时,您实际上是在旧列表 (http://docs.oracle.com/javase/7/docs/api/java/util/List.html#subList(int, int])) 上创建一个视图。难怪当您同时处理所有这些列表时,您会收到 ConcurrentModificationException。

您必须非常小心地处理这些列表(要真正了解哪里出了问题,我们可能需要完整的源代码)。或者您必须创建新的列表实例而不是子列表。

顺便说一句,您翻译大约一半法语的方式使您的代码更难阅读,而不是更容易......(pere-father、child-fils 等)

【讨论】:

  • 很抱歉 =) 谢谢,我会修改这个。我真的不明白为什么当我运行这个函数时它会起作用,但是当我在一段时间内调用它时(真)就不行了......
猜你喜欢
  • 2016-12-23
  • 2011-03-12
  • 2021-07-01
  • 1970-01-01
  • 2014-03-03
  • 2017-02-09
  • 2019-12-26
  • 2013-01-21
  • 2017-02-10
相关资源
最近更新 更多