Параллельная карта с фиксированным размером

Мне нужна карта со следующими требованиями:

  • Он должен быть очень параллельным. Методы 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

Чтобы решить мое требование для ограниченной параллельной хэш-карты: проверьте размер карты перед ее использованием.