1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Скрыть объявление

Привет посетитель! У нас на форуме тебе откроются дополнительные разделы, которые скрыты от гостей! А так же ты найдёшь много полезной информации.

ConcurrentModificationException как исправить

Тема в разделе "Java / Scala", создана пользователем Grind, 18 июл 2015.

  1. Grind

    Grind Заблокирован Пользователь

    Регистрация:
    14 апр 2015
    Сообщения:
    476
    Симпатии:
    118
    Баллы:
    163
    Обратите внимание, если Вы хотите провести сделку с данным пользователем, на то, что он заблокирован.
    Я постараюсь доступным языком рассказать об этой ошибке, её природе и способах устранения.

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

    Для предотвращения (исправления) такой ситуации, в тех колекциях/масивах, где такая ситуация может возникать, необходимо использовать синхронизированную (она же потокобезопасная) коллекцию.

    Потокобезопасные коллекции/массивы всегда будут более затратны по времени и использованию системных ресурсов, поэтому старайтесь избегать таких ситуаций. Однако если другое решение не очевидно или неоправдано, то следует для начала опеределить, требуется ли вам синхронизация чтения/записи или только записи. 1ый вариант более ресурсоемкий чем 2ой.

    Чаще всего в работе с исходным кодом вы будете встречаться с массивами List/ArrayList, в большинстве случаев рассинхрон будет происходить на операциях ввода данных, поэтому мы рассмотрим такой потобезопасный вариант массива как CopyOnWriteArrayList.

    При каждой операции записи CopyOnWriteArrayList будет создавать новую копию ArrayList, тем самым не мешая одновременно чтению данных из этой коллекции.
     
    kick и Elastic Heart нравится это.
  2. kekess

    kekess Интересующийся Партнер

    Регистрация:
    12 май 2015
    Сообщения:
    74
    Симпатии:
    227
    Баллы:
    219
    :Shock1: неужели понял )))), молодец, быстро учишься
     
  3. Grind

    Grind Заблокирован Пользователь

    Регистрация:
    14 апр 2015
    Сообщения:
    476
    Симпатии:
    118
    Баллы:
    163
    Обратите внимание, если Вы хотите провести сделку с данным пользователем, на то, что он заблокирован.
    я не учусь, я практикую, и затруднений в понимании этого не испытывал, будут вопросы обращайся нубас -:D
     
  4. kekess

    kekess Интересующийся Партнер

    Регистрация:
    12 май 2015
    Сообщения:
    74
    Симпатии:
    227
    Баллы:
    219
    -:D практик хренов :rofl1:
     
  5. GenCloud

    GenCloud Заблокирован Open Source
    Contributor

    Регистрация:
    13 апр 2015
    Сообщения:
    425
    Симпатии:
    522
    Баллы:
    757
    Обратите внимание, если Вы хотите провести сделку с данным пользователем, на то, что он заблокирован.
    Боже, для кого ты это обьясняешь??? Для юниоров, и то они знают коллекции, или для кого?
     
    Последнее редактирование модератором: 19 июл 2015
  6. Grind

    Grind Заблокирован Пользователь

    Регистрация:
    14 апр 2015
    Сообщения:
    476
    Симпатии:
    118
    Баллы:
    163
    Обратите внимание, если Вы хотите провести сделку с данным пользователем, на то, что он заблокирован.
    наверно для таких нубасов как ты, которые пропускали математику в 5ом классе и считают что при деление 555 по модулю на 15 мы получим 8 в остатке -:D
    пруф https://mmo-develop.ru/index.php?threads/Оператор-деления-по-модулю.768/poll/results&poll_response_id=47

    для тебя другие задачи у меня есть https://mmo-develop.ru/index.php?threads/Тернарный-оператор-задача.772/#post-8375
     
    Последнее редактирование модератором: 19 июл 2015
    kekess нравится это.
  7. kekess

    kekess Интересующийся Партнер

    Регистрация:
    12 май 2015
    Сообщения:
    74
    Симпатии:
    227
    Баллы:
    219
    -:D ты и его сделал )))))) :rofl1:
     
    Grind нравится это.
  8. Grind

    Grind Заблокирован Пользователь

    Регистрация:
    14 апр 2015
    Сообщения:
    476
    Симпатии:
    118
    Баллы:
    163
    Обратите внимание, если Вы хотите провести сделку с данным пользователем, на то, что он заблокирован.
    :Cowboy:
     
  9. L2CCCP

    L2CCCP Работник недели xD Партнер

    Регистрация:
    19 июн 2015
    Сообщения:
    461
    Симпатии:
    903
    Баллы:
    836
    Уверяю, не все знают коллекции, многие знают только List,ArrayList,Map,HashMap, а бывает и их не знают :D
     
    kick, Grind и kekess нравится это.
  10. L2CCCP

    L2CCCP Работник недели xD Партнер

    Регистрация:
    19 июн 2015
    Сообщения:
    461
    Симпатии:
    903
    Баллы:
    836
    Уверен и того многие не знают, а также EnumMap, LinkedList, PriorityQueue, SortedMap итд туда же, таких коллекции десятки, а если пройтись по форкам то и вовсе сотни
    Тема бесконечна для обсуждения :-)
     
  11. Daan Raven

    Daan Raven Свой человек Проверенный

    Регистрация:
    7 апр 2015
    Сообщения:
    722
    Симпатии:
    328
    Баллы:
    469
    Тогда уж взять интерфейсы, которые эти все коллекции реализуют - Set, Map, List, Queue :-) Ну или вовсе Collection :D

    Тема не имеет смысла, так как описание этого эксепшна есть в офф.документации.
     
  12. zcxv

    zcxv Antihero Проверенный

    Регистрация:
    30 май 2015
    Сообщения:
    491
    Симпатии:
    1.344
    Баллы:
    100
    Стоит упомянуть, что использование коллекций основанных на массивах - очень нежелательно при высокой частоте добавления и удаления элементов, т.к. в CopyOnWrite на каждую такую операцию массив ресайзится. Если такая коллекция долгоживущая, то элементы ее массива попадут в олдген и с большой вероятностью вообще никогда не очистятся (ну опять же, все зависит от настройки JVM, но если говорить конкретно о l2j, то я видел fullgc лишь несколько раз, да и то, от жесткого недостатка памяти; плюс стоит помнить, что fullgc - нежелательный гость).
    Вспоминаем, что все коллекции основанные на массивах имеют RandomAccess, что означает, то что их итерация методом итераторов (уж извините за косноязычие) - плохо и таких людей надо шлепать по попе. В нормальном случае такие коллекции итерируются методом:
    Код:
    for(int i = 0; i < collection.size(); i++) {
      E element = collection.get(i);
      ...
    }
    
    Если мы хотим использовать коллекцию в случаях, когда у нас частые вызовы на удаление/запись, то лучше использовать вещи основанные на нодах, а-ля LinkedBlockingDeque/LinkedBlockingQueue/LinkedList/..., ну и конечно же придется делать свою имплементацию таких вещей и подключать туда кеширование нод, чтобы не напрягать GC.
     
    Grind, kick и Influence нравится это.
  13. Grind

    Grind Заблокирован Пользователь

    Регистрация:
    14 апр 2015
    Сообщения:
    476
    Симпатии:
    118
    Баллы:
    163
    Обратите внимание, если Вы хотите провести сделку с данным пользователем, на то, что он заблокирован.
    я практикую в таких случаях LinkedList, еще я практикую очищение (clear) коллекции/массива после завершнения работы с ним.
     
Похожие темы
  1. woofer
    Ответов:
    1
    Просмотров:
    475
  2. Ancient
    Ответов:
    21
    Просмотров:
    668
  3. Литион
    Ответов:
    17
    Просмотров:
    616
  4. Somon
    Ответов:
    22
    Просмотров:
    733
Загрузка...