Для этого можно использовать класс ConcurrentHashMap
. Например:
Set<T> set = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());
(Вы можете заменить <T, Boolean>
на <>
и позволить компилятору определять типы. Я написал это, как указано выше, для иллюстративных целей.)
Collections::newSetFromMap
javado c говорит:
Возвращает набор, поддерживаемый указанной картой. Результирующий набор отображает те же характеристики упорядочения, параллелизма и производительности, что и резервная карта. По сути, этот фабричный метод обеспечивает реализацию Set
, соответствующую любой реализации Map
.
Поскольку ConcurrentHashMap
допускает одновременную итерацию и обновления, то же самое делает Set
, созданный, как указано выше. Загвоздка в том, что итерация может не видеть эффект добавлений или удалений, сделанных во время итерации.
Свойства параллелизма итерации могут быть выведены из javado c для ConcurrentHashMap
.
Есть ли другой способ.
Это зависит от ваших требований, но есть потенциально способы избежать проблемы. Например, вы могли:
- скопировать набор перед его повторением, ИЛИ
- добавить новый элемент в другой новый набор и добавить существующие элементы в новый набор в новый набор после ... или пока ... итерация.
Однако они вряд ли будут работать без узких мест параллелизма (например, 1.) или различий в поведении (например, 2.)