Параллельная карта с фиксированным размером
Мне нужна карта со следующими требованиями:
-
Он должен быть очень параллельным. Методы put()
, get()
и remove()
могут вызываться одновременно несколькими потоками.
-
Он должен иметь фиксированный размер. Если размер HashMap
достигает максимального значения (например, 10000), добавление новой записи на карту не допускается. Он НЕ МОЖЕТ быть кешем LRU, где самая старая запись удаляется при достижении максимального размера.
ConcurrentHashMap
может удовлетворять # 1. Но не уверен, как № 2 можно реализовать поверх ConcurrentHashMap
без воздействия на concurrency (добавление настраиваемого метода put()
, который добавит карту только тогда, когда размер меньше максимального размера, должен быть "synchronized", что приведет к поражению цели использования параллельного HashMap
).
Пожалуйста, дайте мне знать ваши мысли.
Ответы
Ответ 1
Вы можете реализовать карту, которая делегирует ConcurrentHashMap, используя счетный семафор, чтобы ограничить количество элементов на карте. Класс Semaphore использует атомарно обновляемый int для отслеживания разрешений, поэтому он не будет нести дополнительные дополнительные накладные расходы.
Ответ 2
Вы можете сделать все это самостоятельно, и только один арсенал java SE может предоставить то, что вам нужно, но я настоятельно рекомендую более легкую и масштабируемую методологию, так как вся эта работа сама по себе будет изобретать колесо. Попробуйте одну из них в сетях данных памяти:
Например, в ehcache вы можете достичь того, чего хотите, с помощью конфигурации, похожей на:
<cache
name="myCache"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="false" />
Ответ 3
Как насчет сохранения размера Hashmap в любое время, чтобы обеспечить общее количество вставленных элементов? Вы можете использовать AtomicInteger, чтобы вам не приходилось синхронизировать/блокировать обычный int и жертвовать выгодой использования ConcurrentHashMap.
Ответ 4
Если вы используете ConcurrentHashMap, что здесь является очевидным выбором, используйте вход concurrencyLevel
для конструктора, чтобы увеличить пропускную способность - это отделяет карту от множества зон, чтобы избежать конфликтов puts.
Ответ 5
Чтобы решить мое требование для ограниченной параллельной хэш-карты: проверьте размер карты перед ее использованием.