Если два процесса обновляют коллекцию одновременно, то какое исключение будет возбуждено? - PullRequest
0 голосов
/ 23 марта 2011

Если два процесса в приложении обновляют один java.util.List объект, то какой тип исключения будет вызван?

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

В зависимости от реализации и точного времени, может произойти широкий спектр эффектов:

  • вы можете стать "везунчиком", и ничего плохого не случится (это может даже быть распространенным случаем).
  • вы можете получить ConcurrentModificationException
  • вы можете не получить исключение и просто потерять одно из обновлений (или оба!)
  • вы можете не получить исключение, и одно из обновлений может потеряться в бесконечном цикле (случалось со мной один раз с HashMap, маловероятно для простых List реализаций, но все еще возможно)
  • вы можете не получить исключение и ввести неправильное состояние в свой список (например, один элемент вставлен правильно, за которым следует элемент null).

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

2 голосов
/ 23 марта 2011

Это зависит от точной реализации List (нет объектов java.util.List, потому что это интерфейс).ArrayList состояния:

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

0 голосов
/ 23 марта 2011

Процессы не могут делиться списком. Однако два потока могут совместно использовать список.

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

Короче говоря, если вы хотите изменить Список и использовать его в другом потоке, вы должны использовать потокобезопасную коллекцию.

...