ConcurrentModificationException в iterator.next() Многопоточный

Я создал этот простой рабочий поток для вычисления палиндромов путем итерации по ArrayList. Я получаю сообщение об ошибке при выполнении строки temp_str1 = it.next();. Buffer_List ArrayList не используется никаким другим потоком, поэтому использование синхронизированного блока не помогает. Я просмотрел предыдущие вопросы, и они не очень помогли. Я бы очень хотел найти решение этой проблемы.

Вот мой код:

private void find_Palindromes(ArrayList<String> buffer_List){
    Iterator<String> it = buffer_List.iterator();
    String temp_str1, temp_str2;
    while(it.hasNext()){
        temp_str1 = it.next();
        //System.out.println(temp_str1);
        it.remove();

        if(is_Palindrome(temp_str1)){
            to_Shared_Queue(temp_str1);
            palin_count++;
        }
    }
}

Изменить код: добавлено в_Shared_Queue

  private void to_Shared_Queue(String str){           
        synchronized(shared_queue){
            Shared_queue.add(str);
        }
  }

person Muhammad Ali Qadri    schedule 01.10.2016    source источник
comment
Ваш минимально воспроизводимый пример, пожалуйста.   -  person Hovercraft Full Of Eels    schedule 01.10.2016
comment
Посмотрите на ответ этого парня, может вам помочь. Это метод удаления, который вы используете для удаления элемента из списка ArrayList. stackoverflow.com/ вопросы/15993356/   -  person kevto    schedule 01.10.2016
comment
Бьюсь об заклад, вы изменяете buffer_List в методе to_Shared_Queue.   -  person MGorgon    schedule 01.10.2016
comment
@MGorgon: это тоже моя ставка, но кто, черт возьми, знает наверняка.   -  person Hovercraft Full Of Eels    schedule 01.10.2016
comment
@MGorgon Я отправляю только строку temp_str1 в параметре to_Shared_Queue, поэтому список не изменяется.   -  person Muhammad Ali Qadri    schedule 01.10.2016
comment
К сожалению, объекты (все, что не является примитивом), такие как списки, передаются по ссылке, поэтому имеется только одна копия, и вы изменяете тот же самый объект. См. этот канонический вопрос stackoverflow.com/questions/40480/   -  person Jim Garrison    schedule 01.10.2016
comment
не могли бы вы тогда добавить свой метод to_Shared_Queue? если список там не изменен, возможно, к списку все еще каким-то образом обращаются одновременно...   -  person user140547    schedule 01.10.2016
comment
Вы каким-то образом изменяете ArrayList, проходя через него. Вам нужно выяснить, как, проверив метод, который вы не показываете, скорее всего.   -  person Hovercraft Full Of Eels    schedule 01.10.2016
comment
Если Shared_queue - это тот же список, что и buffer_List, то у вас есть ответ, что не так.   -  person MGorgon    schedule 02.10.2016


Ответы (1)


Это из-за того, что вы модифицируете итератор во время цикла. вы можете сделать это, удалив его из массива buffer_List. buffer_List.remove (temp_str1);

person jdev    schedule 01.10.2016
comment
это выглядит как полная противоположность тому, что мы рекомендуем. - person Hovercraft Full Of Eels; 01.10.2016