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