Java arraylist的并发修改

Java arraylist的并发修改,java,for-loop,arraylist,concurrentmodification,Java,For Loop,Arraylist,Concurrentmodification,有很多并发的mod异常问题,但我无法找到一个帮助我解决问题的答案。如果你找到一个答案,请提供一个链接,而不是直接投票 因此,我最初在尝试搜索arraylist并删除元素时出现并发mod错误。有一段时间,我通过创建第二个arraylist来解决这个问题,将发现的元素添加到arraylist中,然后在For循环外部使用removeAll()。这似乎是可行的,但当我使用for循环从多个文件导入数据时,我又开始出现并发修改异常,但由于某种原因,这种异常是间歇性的。任何帮助都将不胜感激 下面是出现问题的特

有很多并发的mod异常问题,但我无法找到一个帮助我解决问题的答案。如果你找到一个答案,请提供一个链接,而不是直接投票


因此,我最初在尝试搜索arraylist并删除元素时出现并发mod错误。有一段时间,我通过创建第二个arraylist来解决这个问题,将发现的元素添加到arraylist中,然后在For循环外部使用removeAll()。这似乎是可行的,但当我使用for循环从多个文件导入数据时,我又开始出现并发修改异常,但由于某种原因,这种异常是间歇性的。任何帮助都将不胜感激

下面是出现问题的特定方法(以及它调用的其他方法…):

线程“AWT-EventQueue-0”java.util.ConcurrentModification中出现异常 nException 在java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)中 在java.util.ArrayList$Itr.next(ArrayList.java:851) 位于data.ServiceRequest.removeData(ServiceRequest.java:195) 位于data.ServiceRequest.addData(ServiceRequest.java:209)

编辑 在进一步搜索之后,我将for循环切换为:

        Iterator<ServiceRequest> it = serviceQueue.iterator();
        while(it.hasNext()) {
Iterator it=serviceQueue.Iterator();
while(it.hasNext()){

我的意思是,我第一次尝试导入数据时(removeData方法是从addData方法触发的)它会触发并发mod异常,但下一次尝试时,它会跳过该故障并移动到另一个文件。我知道有很多并发mod问题,但我没有发现任何对我的情况有帮助的东西,所以链接到其他答案是非常受欢迎的…

这不是怎么做的,在浏览时删除元素h使用迭代器创建列表。如下所示:

List<ServiceRequest> targets = new ArrayList<ServiceRequest>();
for(Iterator<ServiceRequest> it = targets.iterator(); it.hasNext();) {
    ServiceRequest currentServReq = it.next();
    if(someCondition) {
        it.remove();
    }
}
List targets=new ArrayList();
for(Iterator it=targets.Iterator();it.hasNext();){
ServiceRequest currentServReq=it.next();
如果(某些条件){
it.remove();
}
}
如果只有一个线程,则不会通过这种方式获得ConcurrentModificationException


如果代码中涉及多个线程,您可能仍然会得到ConcurrentModificationException。解决此问题的一种方法是在集合(serviceQueue)上使用Collections.synchronizedCollection(…)因此,您将得到一个不会产生ConcurrentModificationException的同步集合。但是,您的代码可能会变得非常慢。

“for循环从多个文件导入数据”你能发布吗?为什么所有的
都是静态的
和什么是
服务队列
?堆栈跟踪,异常行号,有多少项,异常模式..基本上更多的细节,请。我标记了堆栈跟踪使用注释文本捕获的行,这也恰好是失败的for循环。感谢e快速响应。@RC serviceQueue是所有已生成的ServiceRequest的ArrayList,与xml文件匹配。您不能使用Queue(如ArrayQueue)而不是List(如ArrayList)吗?我不熟悉ArrayDeque。现在搜索,你有推荐的链接@nyamiouthegaleanstrope吗?所以我用迭代器替换了删除元素的if/else语句(我将在问题中提出新代码),但我仍然在同一位置得到并发mod异常(在注释中标记的for循环中)…实际上,最后一组更改成功了。我未能覆盖对正在运行的版本所做的更改!再次感谢@nuamiouthegaleanstrop
        Iterator<ServiceRequest> it = serviceQueue.iterator();
        while(it.hasNext()) {
List<ServiceRequest> targets = new ArrayList<ServiceRequest>();
for(Iterator<ServiceRequest> it = targets.iterator(); it.hasNext();) {
    ServiceRequest currentServReq = it.next();
    if(someCondition) {
        it.remove();
    }
}