Как получить итератор с фиксированным состоянием для набора / карты без клонирования накладных расходов - PullRequest
0 голосов
/ 17 июня 2011


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

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

Интересно, есть ли реализация Java, в которой итератор возвращает состояние снимка коллекции (что нормально для моей функциональности), но избегает затрат?клонировать слишком много.Я проверил CopyOnWriteArrayList, но он не отвечает всем требованиям в основном из-за того, что он список.

Ответы [ 2 ]

1 голос
/ 17 июня 2011

В пакете java.util.concurrent есть все необходимое.

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

итератор возвращает состояние снимка коллекции

Не изобретай велосипед :)

0 голосов
/ 17 июня 2011

Интересно, есть ли реализация Java, в которой итератор возвращает состояние снимка коллекции

Да, есть. В отличие от синхронизированных коллекций, доступных через методы Collections.synchronizedxxx (), классы Concurrentxxx в пакете java.util.concurrent позволили бы использовать этот сценарий. Параллельные классы коллекции позволяют нескольким потокам получать доступ к коллекции в один и тот же момент времени без необходимости синхронизации при блокировке.

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

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

Обратите внимание на последнее предложение.

Также помните, что это непоследовательные снимки возвращаемой коллекции. Итераторы из большинства возвращаемых методов обладают следующим свойством:

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

Смежные вопросы

...