Java LinkedList的ConcurrentModificationException
我有一个对象的LinkedList和一个迭代器。我知道,当您在运行迭代器时尝试修改列表时,会引发ConcurrentModificationException。但在我的情况下,我不明白这种修改是在哪里进行的 迭代器如下所示:Java LinkedList的ConcurrentModificationException,java,iterator,linked-list,Java,Iterator,Linked List,我有一个对象的LinkedList和一个迭代器。我知道,当您在运行迭代器时尝试修改列表时,会引发ConcurrentModificationException。但在我的情况下,我不明白这种修改是在哪里进行的 迭代器如下所示: private static void insertTasks(Task t) { if(eventQueue.size() == 0) { eventQueue.addFirst(tsk); return; } i
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++;
}
}
任务
对象中的getArrivalTime
如下所示:
public float getArrivalTime() { return arrivalTime; }
我的问题是,我在哪里做这个修改?运行该迭代器的while
循环没有进行任何修改。是吗
我遗漏了什么吗?我想问题在于,
itr
是类中的一个静态字段,这就产生了问题,因为您在第二次调用insertTasks()
时向eventQueue
添加了一个元素
避免静态字段。。。让自己尽可能地害怕和避免它们:)。它们是邪恶的,而且非常不友好。我认为问题在于
itr
是类中的一个静态字段,这就产生了问题,因为您在第二次调用insertTasks()
时向eventQueue
添加了一个元素
避免静态字段。。。让自己尽可能地害怕和避免它们:)。它们是邪恶的,而且非常不友好。您是否从多个线程访问它?在迭代时,您是否可以在代码中其他地方的另一个线程中修改它?否。我只有一个
main
线程。您是否可以提供一个复制该问题的自包含示例?很可能您正在更改未提供的代码中的集合。顺便说一句,我将使用double
而不是float
,除非您有很好的理由这样做。您是否从多个线程访问它?在迭代时,您是否可以在代码中其他地方的另一个线程中修改它?否。我只有一个main
线程。您是否可以提供一个复制该问题的自包含示例?很可能您正在更改未提供的代码中的集合。顺便说一句,除非您有很好的理由这样做,否则我将使用double
而不是float
。但是在对insertTasks
的第二次调用中,eventQueue
未被修改。因为eventQueue
的size()
在第一次调用后不是零。我也调试过了,你说得对。问题是,在第一次调用insertTask()
时,您已经在其他地方从空列表创建了迭代器。现在您正在添加一个元素。@gaganbm您在第一次调用之前初始化了itr
,因此第一次调用通过插入项使迭代器无效,第二次调用在尝试迭代后崩溃。但是在对insertTasks
的第二次调用中,eventQueue
未被修改。因为eventQueue
的size()
在第一次调用后不是零。我也调试过了,你说得对。问题是,在第一次调用insertTask()
时,您已经在其他地方从空列表创建了迭代器。现在您正在添加一个元素。@gaganbm您在第一次调用之前初始化了itr
,因此第一次调用通过插入项使迭代器无效,第二次调用在尝试迭代后崩溃。
public float getArrivalTime() { return arrivalTime; }