2012-09-18 2 views
1

개체 및 반복기의 LinkedList를가집니다. 이 이터레이터를 실행하는 동안 목록을 수정하려고하면이 ConcurrentModificationException이 발생합니다. 하지만 제 경우에는이 수정이 어디에서 이루어지고 있는지 이해할 수 없습니다. 아래 그림과 같이Java 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; } 

내 질문은 어디에 있습니까? 이 수정을하고 있습니까? 이 iterator을 실행하는 while 루프는 수정 작업을 수행하지 않습니다. 그거야?

내가 누락 된 항목이 있습니까? 나는이 문제를 이해 할수

+1

두 개 이상의 스레드에서 액세스합니까? iterating 동안 코드의 다른 곳에서 다른 스레드에서 수정할 수 있습니까? –

+0

아니요. 하나의'main' 스레드 만 있습니다. – gaganbm

+0

문제를 재현하는 자체 포함 된 예제를 제공 할 수 있습니까? 제공하지 않은 코드로 컬렉션을 변경하고있는 것 같습니다. –

답변

5

itr이 클래스의 정적 필드이며 insertTasks()에 두 번째 통화에 eventQueue에 요소를 추가하는 것처럼 즉, 문제를 만드는 점이다.

정적 필드를 피하십시오 ... 자신을 프로그램하여 두려워하고 최대한 피하십시오. :). 그들은 악하고 OO는 비우호적이다.

+0

그러나 두 번째'insertTasks '호출에서'eventQueue'는 수정되지 않습니다. 'eventQueue'의'size()'는 첫번째 호출 이후에 0이 아니기 때문에. 나는 그것도 디버깅했다. – gaganbm

+0

네 말이 맞아. 문제는'insertTask()'를 처음 호출했을 때 이미 빈 곳에서 반복자를 생성했다는 것입니다. 이제 요소를 추가하고 있습니다. – Augusto

+1

@gaganbm 첫 번째 호출 전에 itr을 초기화 했으므로 첫 번째 호출은 항목을 삽입하여 반복기를 무효화하고 반복 시도 후에 두 번째 호출이 충돌합니다. – dasblinkenlight

관련 문제