Вопрос по java – Ошибка одновременного изменения при добавлении элементов в LinkedList

1

У меня есть список объектов 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);
    }

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

Ваш Ответ

3   ответа
6

это потому, что вы редактируете список, а затем пытаетесь использовать исходные итераторы. API коллекцийэто не позволяет, Вам нужно создать новые итераторы после редактирования списка.

For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it. In general, the results of the iteration are undefined under these circumstances. Some Iterator implementations (including those of all the general purpose collection implementations provided by the JRE) may choose to throw this exception if this behavior is detected. Iterators that do this are known as fail-fast iterators, as they fail quickly and cleanly, rather that risking arbitrary, non-deterministic behavior at an undetermined time in the future.

Note that this exception does not always indicate that an object has been concurrently modified by a different thread. If a single thread issues a sequence of method invocations that violates the contract of an object, the object may throw this exception. For example, if a thread modifies a collection directly while it is iterating over the collection with a fail-fast iterator, the iterator will throw this exception.

эй, я понял :) спасибо много, его работает NW :) Divyashree
@ Divyashree Пожалуйста, примите ответ .. Это поможет вам получить больше помощи
0

рсии (jdk 1.4) вы не найдете эту проблему.

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

Solution 1: The list can be converted to an array with list.toArray() and iterate on the array. This approach is not recommended if the list is large.

Answer 2: The entire list can be locked while iterating by wrapping your code within a synchronized block. This approach adversely affects scalability of your application if it is highly concurrent.

Answer 3: JDK 1.5 gives you ConcurrentHashMap and CopyOnWriteArrayList classes, which provide much better scalability and the iterator returned by ConcurrentHashMap.iterator() will not throw ConcurrentModificationException while preserving thread-safety.

Answer 4: Remove the current object via the Iterator “it” which has a reference to the underlying collection “myStr”. The Iterator object provides it.remove() method for this purpose.

большое спасибо :) ваш пост был очень полезным :) Divyashree
1

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

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

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

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

Я извиняюсь :) Спасибо за ответ :) Divyashree

Похожие вопросы