Как реализовать ConcurrentHashMap с функциями, подобными в LinkedHashMap?

Вы не хотите делать это, если Вы только не собираетесь быть контактом с людьми от одной культуры.

, Например:

фамилией Guido van Rossum является van Rossum.

именем Hayao МИЯДЗАКИ является Hayao.

наибольший успех, который Вы могли сделать, должен снять изоляцию с общих заголовков и приветов, и попробовать некоторую эвристику.

, Несмотря на это, самое легкое решение состоит в том, чтобы просто сохранить полное имя или попросить данный и фамилию отдельно.

14
задан Jim Ferrans 29 November 2009 в 16:41
поделиться

4 ответа

Недавно я сделал нечто подобное с ConcurrentHashMap , где CacheEntry обертывает фактический элемент и добавляет статистику удаления кеша: время истечения срока действия, время вставки (для FIFO / LIFO-выселение), время последнего использования (для выселения LRU / MRU), количество совпадений (для выселения LFU / MFU) и т. Д. Фактическое выселение синхронизируется и создает ArrayList и выполняет Collections .sort () с использованием соответствующего компаратора для стратегии выселения. Поскольку это дорого, каждое выселение отсекает нижние 5% CacheEntries. Я уверен, что настройка производительности поможет.

В вашем случае, поскольку вы используете FIFO, вы можете сохранить отдельную ConcurrentLinkedQueue . Когда вы добавляете объект в ConcurrentHashMap, выполните ConcurrentLinkedQueue.add () этого объекта. Если вы хотите удалить запись, выполните ConcurrentLinkedQueue.poll (), чтобы удалить самый старый объект, а затем удалите его также из ConcurrentHashMap.

Обновление: другие возможности в этой области включают оболочку синхронизации Java Collections и Java 1.6 ConcurrentSkipListMap .

11
ответ дан 1 December 2019 в 14:33
поделиться

Вы упомянули, что хотите решить проблемы масштабируемости с помощью «поточно-ориентированной» альтернативы. «Поточная безопасность» здесь означает, что структура толерантна к попыткам одновременного доступа, в том смысле, что она не будет повреждена из-за одновременного использования без внешней синхронизации. Однако такая терпимость не обязательно помогает улучшить «масштабируемость». В простейшем - хотя обычно ошибочном - подходе вы попытаетесь синхронизировать свою структуру изнутри и по-прежнему оставите неатомарные операции проверки и действия небезопасными.

Кеши LRU требуют по крайней мере некоторых осведомленность об общей структуре. Им нужно что-то вроде подсчета или размера членов, чтобы решить, когда выселять, а затем они должны иметь возможность координировать выселение с одновременными попытками чтения, добавления или удаления элементов. Попытка уменьшить синхронизацию, необходимую для одновременного доступа к «основной» структуре, борется с вашим механизмом выселения и заставляет вашу политику выселения быть менее точной в своих гарантиях.

В принятом в настоящее время ответе упоминается, «когда вы хотите выселить запись. ". В этом и заключается загвоздка. Как узнать, что вы хотите выселить запись? Какие еще операции вам нужно приостановить, чтобы принять это решение?

В принятом на данный момент ответе упоминается «когда вы хотите выселить запись». В этом и заключается загвоздка. Как вы узнаете, что хотите выселить запись? Какие еще операции вам нужно приостановить, чтобы принять это решение?

В принятом на данный момент ответе упоминается «когда вы хотите выселить запись». В этом и заключается загвоздка. Как узнать, что вы хотите выселить запись? Какие еще операции вам нужно приостановить, чтобы принять это решение?

0
ответ дан 1 December 2019 в 14:33
поделиться

Оберните карту в Collections.synchronizedMap () . Если вам нужно вызвать дополнительные методы, тогда синхронизируйте на карте, полученной вами в результате этого вызова, и вызовите исходный метод на исходной карте ( см. Пример в документации javadoc ) . То же самое применимо, когда вы перебираете ключи и т. Д.

-2
ответ дан 1 December 2019 в 14:33
поделиться

Пробовали ли вы использовать одно из многих решений для кэширования, например ehcache? Вы можете попробовать использовать LinkedHashMap с ReadWriteLock. Это даст вам одновременный доступ для чтения.

2
ответ дан 1 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: