【问题标题】:ConcurrentModificationException for Java LinkedListJava LinkedList 的 ConcurrentModificationException
【发布时间】:2012-09-18 09:35:06
【问题描述】:

我有对象的 LinkedList 和一个迭代器。我知道当您在运行迭代器时尝试修改列表时会抛出这个 ConcurrentModificationException 。但就我而言,我不明白这个修改是在哪里进行的。

迭代器如下所示:

private static void insertTasks(Task t) {
    if(eventQueue.size() == 0) {
        eventQueue.addFirst(tsk);
        return;
    }

    int pos = 0;
    while (itr.hasNext()){
   //The line below throws the exception

        if (t.getArrivalTime() <= itr.next().getArrivalTime() ) 
        {           
            break;
        }
        pos++;
    }
}

我正在从另一个方法调用这个insertTasks 方法,如下所示:

tsk = null;
tsk = new Task(1,"P1",1,4.0f,1.5f,0.0f,8.0f);
insertTasks(tsk);

tsk = null;
tsk = new Task(0,"P0",2,5.0f,2.5f,1.0f,10.0f);
insertTasks(tsk);

Task 对象中的getArrivalTime 看起来像:

public float getArrivalTime() { return arrivalTime; }

我的问题是,我在哪里做这个修改?我运行这个iteratorwhile 循环没有做任何修改。是吗?

我错过了什么吗?

【问题讨论】:

  • 您是否从多个线程访问它?您能否在迭代时在代码的其他地方的另一个线程中修改它?
  • 没有。我只有一个main 线程。
  • 您能否提供一个能够重现该问题的独立示例?您可能正在更改未提供的代码中的集合。
  • 顺便说一句,我会使用double 而不是float,除非你有充分的理由这样做。

标签: java iterator linked-list


【解决方案1】:

我认为问题在于 itr 是您班级中的静态字段,这会造成问题,因为您在第二次调用 insertTasks() 时向 eventQueue 添加了一个元素。

避免静态字段...对自己进行编程以恐惧它们并尽可能避免它们:)。他们邪恶,OO 不友好。

【讨论】:

  • 但是在第二次调用 insertTasks 时,eventQueue 没有被修改。由于eventQueuesize() 在第一次调用后不为零。我也调试过了。
  • 你是对的。问题是,在您第一次调用insertTask() 时,您已经从一个空列表中的其他地方创建了迭代器。现在您正在添加一个元素。
  • @gaganbm 你在第一次调用之前初始化了itr,所以第一次调用通过插入一个项目使迭代器失效,第二次调用在尝试迭代后崩溃。
猜你喜欢
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多