[英]Can't figure out the reason for ConcurrentModificationException
[英]I can't figure out this ConcurrentModificationException
我觉得我的Java生锈了,所以我尝试了一个简单的问题:使用Linked Lists进行合并排序,只返回唯一值。 以下是我的第一次尝试之一。 这对我来说很有意义。 问题是,无论我做了什么,我总是得到一个ConcurrentModificationException
。
我尝试过的事情包括:
synchronized
。 sort
方法中的迭代器替换LinkedLists。 没有任何效果。 ConcurrentModificationsException
移动到其他地方但它仍然存在。 我真的不确定为什么。 我怎样才能解决这个问题?
在此特定尝试中,在调用addAll
时发生异常。 我将列表中的所有操作都放在了自己的块中,但Java显然并不关心。
package com.regularoddity.dotcloud;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class Merge {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> myList = new LinkedList<Integer>();
myList.add(2);
myList.add(9);
myList.add(1);
myList.add(3);
myList.add(8);
myList.add(7);
myList.add(1);
myList = sort(myList);
Iterator<Integer> lit = myList.iterator();
while(lit.hasNext()) System.out.printf("%s ", lit.next());
}
private static List<Integer> merge(List<Integer> list1, List<Integer> list2) {
List<Integer> result = new LinkedList<Integer>();
int size1 = list1.size();
int size2 = list2.size();
{
while (size1 > 0 && size2 > 0) {
if (list1.get(0) == list2.get(0)) {
result.add(list1.remove(0));
list2.remove(0);
size1--; size2--;
}
else if (list1.get(0) <= list2.get(0))
{
result.add(list1.remove(0));
size1--;
}
else
{
result.add(list2.remove(0));
size2--;
}
}
}
result.addAll(list1);
result.addAll(list2);
return result;
}
private static List<Integer> sort(List<Integer> list) {
int lsize = list.size();
if (lsize <= 1) return list;
int pivot = lsize / 2;
List<Integer> list1 = list.subList(0, pivot);
List<Integer> list2 = list.subList(pivot, lsize);
list1 = sort(list1);
list2 = sort(list2);
return merge(list1, list2);
}
}
令我感到困惑的是我从未明确地与列表进行交互。 必须有一个隐式迭代,但我似乎无法将其分解出来。
编辑:我没有包括堆栈跟踪,因为我(愚蠢地)认为,因为它改变了每次修复的尝试,它将没有用。 但是,实际上,它没有太大变化。 这是当前实现的堆栈跟踪:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.SubList.checkForComodification(AbstractList.java:752)
at java.util.SubList.size(AbstractList.java:625)
at com.regularoddity.dotcloud.Merge.merge(Merge.java:30)
at com.regularoddity.dotcloud.Merge.sort(Merge.java:64)
at com.regularoddity.dotcloud.Merge.sort(Merge.java:62)
at com.regularoddity.dotcloud.Merge.main(Merge.java:23)
com.regularoddity.dotcloud.Merge.main(Merge.java:23)
该的javadoc的subList
指出:
如果支持列表(即此列表)在结构上以除返回列表之外的任何方式进行修改,则此方法返回的列表的语义将变为未定义。
在您的情况下,您调用subList
两次并通过两个子列表修改原始列表。 这是你的例外的来源。
在不改变代码的情况下,您可以简单地制作副本以避免出现此问题:
List<Integer> list1 = new LinkedList<> (list.subList(0, pivot));
List<Integer> list2 = new LinkedList<> (list.subList(pivot, lsize));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.