воскресенье, 8 августа 2010 г.

Реализация concurrent HashSet-а в Java

К сожалению, в 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 комментариев:

dimka комментирует...

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

Анонимный комментирует...

Разве Гугл коллекции не реализовали?

Alex комментирует...

Вот ещё один неплохой метод:
Collections.newSetFromMap(new ConcurrentHashMap());
Но это только для 1.6

Никита Кокшаров комментирует...

В google-collections я аналога не нашел.

Никита Кокшаров комментирует...

Alex, спасибо за совет!