Какова лучшая практика, чтобы предотвратить случайное исключение ConcurrentModificationException в Java? - PullRequest
1 голос
/ 11 января 2011

Какая последовательность кода для итерации по списку или карте предотвращает исключение ConcurrentModificationException?Мы неоднократно и периодически возникали исключения ConcurrentModificationException в нашем коде.Есть 2 причины этой проблемы.

  1. Другой поток меняет список при повторении
  2. Метод, вызываемый в цикле, меняет список.1008 * Проблема 1 может быть решена с помощью синхронизированного цикла.Но это плохо, если чужой код вызывается в цикле как причина 2.

    Проблема 2 может быть решена с помощью копии списка или карты.

    Это означает, что список или картаскопировать в синхронизированный блок перед циклом.Есть ли лучшее решение?

    Пример кода:

    public void todoSomeThings( Map<Abc, Object> map ){
        for( Abc abc : map.keySet() ){
            abc.todoSomeThings();
        }
    }
    

Ответы [ 2 ]

7 голосов
/ 11 января 2011

Рассматривали ли вы использование одновременных коллекций в java.util.concurrent?Трудно дать гораздо лучший совет, если честно ... нам нужно больше подробностей.

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

3 голосов
/ 11 января 2011

Справедливое предупреждение: использование j.u.c (java.util.concurrent) удалит ошибки, но вы столкнетесь, возможно, с худшим случаем, то есть с обновлениями гонки, устаревшими чтениями и т. Д.

Знайте свои структуры данных, используйте состояния ... или, по крайней мере (что не лучше), используйте блокировки.

...