Я рассматривал проблему написания параллельной Multimap , и у меня есть реализация, поддерживаемая Google Guava AbstractSetMultimap и вычислительной картой MapMaker, которая создает по требованиюколлекции значений как представление набора над ConcurrentHashMap.С некоторой заботой о коллекциях представлений и различных обертках, я думаю, это довольно близко.
Большая проблема, которая уже была обсуждена другими who попробовал это , похоже, это удаление коллекций значений из базовой карты, когда они становятся пустыми, без введения расы.
По-видимому, существует несколько вариантов.
- оставить там пустые коллекции.Это приведет к утечке некоторых CHM, но я считаю, что это по крайней мере правильно.
- Попытка оптимистично удалить коллекцию, когда она пуста, и компенсировать, если в ней что-то еще появится.Это полно рас и кажется, что по сути невозможно исправить.
- синхронизирует все в сборе значений, что, по крайней мере, позволило бы это удаление, но за счет любого параллелизма после первоначального поиска по ключу.
- для меньшего штрафа (возможно, в зависимости от моделей использования?), Возможно, синхронизации при создании и удалении сбора значений, необходимо проверить, охватывает ли это все.
Вопросы:
- Кто-нибудь знает о лучшей реализации, чем эта?Можем ли мы лучше составить биты из MapMaker, или для этого нужен специальный ConcurrentHashMultimap, написанный с нуля?
- Если это трудно улучшить, является ли эта утечка большой проблемой на практике?Известные коллекции, такие как java.util.HashMap, juc.ConcurrentHashMap и ArrayDeque, не изменяют размер резервного хранилища вниз, а ArrayList не делает этого автоматически.Пока мы очищаем объекты, мне интересно, будет ли это иметь слишком большое значение.
Спасибо
Редактировать: см. Также обсуждение здесь в списке рассылки гуавы.
Редактировать 2: С тех пор я написал это.Пожалуйста, смотрите эту область кода Google для реализации.Я был бы очень признателен за любые отзывы от тех, кто пробует, там, а не здесь.