К сожалению, в JDK нет полноценной реализации concurrent HashSet-а, как в случае для HashMap - java.util.concurrent.ConcurrentHashMap
. Есть CopyOnWriteArraySet
, использующий внутри себя CopyOnWriteArrayList
, но у него есть некоторые недостатки:
- поиск элементов будет медленне ибо в List-ах он выполняется по equals, а не по hashcode -> equals.
- невозможность удаления объектов при итерации (iterator.remove() - не реализован) и понятно почему, ведь при итерации используется копия коллекции.
Но выход есть, подобие ConcurrentHashSet можно сделать на основе ConcurrentHashMap, записывая как ключ элемент, а в значение какой-нибудь dummy-объект. Такая реализация представлена в виде org.jboss.util.collection.ConcurrentSet
из бибилиотеки jboss-common-core.