К сожалению, в 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.
5 комментариев:
Если, я не ошибаюсь то HashSet это и есть HashMap без значений, не понятно почему с concurent версией так же не сделали...
Разве Гугл коллекции не реализовали?
Вот ещё один неплохой метод:
Collections.newSetFromMap(new ConcurrentHashMap());
Но это только для 1.6
В google-collections я аналога не нашел.
Alex, спасибо за совет!
Отправить комментарий