2012-04-13 3 views
1

У меня есть список объектов LinkedList.Ошибка одновременной модификации при добавлении элементов в LinkedList

List<LinkedList<File1>> backup = new ArrayList<LinkedList<File1>>(); 

В LinkedList содержатся некоторые элементы. Мне нужно добавить дополнительные элементы динамически, нажав кнопку. Выполняя это, я получаю ошибку одновременной модификации. Я действительно не понимаю, почему эта ошибка появляется. Вот код:

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt)  
{           
    // When JOIN button is clicked 
    int parent_node,dist_node; 
    // List<File1> temp_list = new ArrayList<File1>(); 
    File1 f_new = new File1(); 
    parent_node = Integer.parseInt(jTextField4.getText()); 
    dist_node = Integer.parseInt(jTextField5.getText()); 
    LinkedList<File1> tmp_bk = backup.get(parent_node); 
    System.out.println("parent node : " + parent_node); 
    System.out.println("dist node : " + dist_node); 
    System.out.println("no of lists : " + backup.size()); 
    f_new.nod = backup.size(); 
    f_new.dist = dist_node; 
    // temp_list.add(f_new); 
    tmp_bk.add(f_new); 

    ListIterator itr = it_bk.get(parent_node); 
    while(itr.hasNext()) 
    { 
     File1 f = (File1)itr.next(); 
     System.out.println("NODE : " + f.nod + "DIST : " + f.dist); 
    } 

}  
+0

У меня также есть список массивов итераторов, которые были сделаны для указания каждого связанного списка. – Divyashree

ответ

6

Это, вероятно, потому, что вы редактируете список, а затем пытается использовать оригинальные итераторы. Коллекции API doesn't allow that. После редактирования списка вам нужно создать новые итераторы.

Например, для одного потока обычно не разрешается изменять коллекцию, в то время как другой поток выполняет итерацию по ней. В общем случае результаты итерации в этих условиях не определены. Некоторые реализации Iterator (в том числе и для всех реализаций коллекции общего назначения, предоставляемых JRE) могут выбрать выброс этого исключения, если это обнаружено. Итераторы, которые делают это, известны как отказоустойчивые итераторы, поскольку они терпят неудачу быстро и чисто, а скорее рискуют произвольным, недетерминированным поведением в неопределенное время в будущем.

Обратите внимание, что это исключение не всегда указывает, что объект был одновременно изменен другим потоком. Если один поток выдает последовательность вызовов методов, которые нарушают договор объекта, объект может выдать это исключение. Например, если поток изменяет коллекцию напрямую, когда он выполняет итерацию по коллекции с быстрым итератором, итератор выкинет это исключение.

+0

эй я понял :) много, его рабочий nw :) – Divyashree

+1

@ Divyashree Пожалуйста, примите ответ .. Это поможет вам получить дополнительную помощь – Jayan

1

Во-первых, если вы действительно ожидаете, что люди обратят ваше внимание на ваш вопрос, вы должны сделать им одолжение, прося его четко и на стандартном английском языке.

Во-вторых, вы должны указать, где именно вы в коде получаете ConcurrentModificationError.

И, наконец, что такое it_bk? Он просто отображается в вашем коде без каких-либо объяснений. Если это ArrayList ListIterators, возможно, что его элемент parent_node-th находится в состоянии, когда он не уверен, что hasNext() или next() будут в безопасности. Я предполагаю, что вы изменили базовую коллекцию своим tmp_bk.add (f_new);, и поэтому существующий итератор обеспокоен тем, что его инварианты могут быть нарушены.

Генеральный совет: Не создавайте и сохраняйте итераторы (или их коллекции). Когда вам нужен Итератор, создайте его, используйте его и откажитесь от него.

+0

ya sorry :) thnks для ответа :) – Divyashree

0

java.lang.Colletions от JDK 1.5 не синхронизирован. В более ранней версии (jdk 1.4) вы не найдете эту проблему.

Существует множество решений для этой проблемы, и вам нужно выбрать один из них с умом в соответствии с вашим вариантом использования.

  • Решение 1. Список может быть преобразован в массив с list.toArray() и итерации по массиву. Этот подход не рекомендуется, если список большой.

  • Ответ 2: Весь список можно заблокировать во время итерации путем переноса кода в синхронизированный блок. Этот подход отрицательно сказывается на масштабируемости вашего приложения, если он сильно параллелен.

  • Ответ 3: JDK 1.5 дает вам классы ConcurrentHashMap и CopyOnWriteArrayList, которые обеспечивают гораздо лучшую масштабируемость, и итератор, возвращаемый ConcurrentHashMap.iterator(), не будет бросать ConcurrentModificationException при сохранении безопасности потоков.

  • Ответ 4: Удалите текущий объект через Итератор «он», который имеет ссылку на базовую коллекцию «myStr». Объект Iterator предоставляет для этого метод it.remove().

+0

thnks много :) ur post был полезен :) – Divyashree

Смежные вопросы