Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
06 Апр 2023
2 мин
165

Отсутствие ConcurrentHashSet в Java: причины и решения

Среди разнообразия коллекций в Java, HashSet и HashMap являются одними из наиболее часто используемых за счет своей высокой производительности. Однако, при

Среди разнообразия коллекций в Java, HashSet и HashMap являются одними из наиболее часто используемых за счет своей высокой производительности. Однако, при работе с многопоточными приложениями, возникает необходимость в использовании потокобезопасных коллекций. В случае с HashMap, такой коллекцией является ConcurrentHashMap. Но что делать, если необходим потокобезопасный аналог HashSet?

Проблема

Допустим, есть ситуация, когда несколько потоков одновременно обращаются к одному и тому же HashSet, что может привести к неожиданным и нежелательным результатам. Логичным решением кажется использование некой ConcurrentHashSet, однако в стандартной библиотеке Java такого класса нет.

Причины

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

Так почему же нет ConcurrentHashSet? Основной причиной является отсутствие необходимости. ConcurrentHashMap предоставляет все необходимые средства для обеспечения потокобезопасности, и его можно использовать для реализации аналога ConcurrentHashSet.

Решение

Если есть необходимость в использовании потокобезопасного HashSet, можно просто использовать ConcurrentHashMap и игнорировать значения. Для этого достаточно хранить в качестве значений, например, булевы значения. В этом случае, ConcurrentHashMap будет работать как ConcurrentHashSet.

Также, можно использовать класс Collections.newSetFromMap(), который принимает в качестве аргумента Map и возвращает Set, базирующийся на этом Map. То есть, можно передать в этот метод ConcurrentHashMap, и получить потокобезопасный Set.

В заключение, можно сказать, что, хотя в Java нет класса ConcurrentHashSet, есть все необходимые средства для создания потокобезопасного аналога HashSet.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий