Как бы вы реализовали LRU-кеш в Java?
Пожалуйста, не говорите EHCache или OSCache и т. Д. Предположим, что для целей этого вопроса я хочу реализовать свой собственный, используя только SDK (обучение на практике). Учитывая, что кеш будет использоваться в многопоточной среде, какие структуры данных вы бы использовали? Я уже реализовал один, используяLinkedHashMap а такжеКоллекции # synchronizedMap, но мне любопытно, будут ли какие-либо из новых параллельных коллекций более подходящими кандидатами.
ОБНОВЛЕНИЕ: я только читалПоследний Yegge когда я нашел этот самородок:
Если вам нужен постоянный доступ и вы хотите поддерживать порядок вставки, вы не можете сделать лучше, чем LinkedHashMap, действительно замечательная структура данных. Единственный способ, которым это могло бы быть более чудесным, - это наличие параллельной версии. Но увы.
Я думал почти то же самое, прежде чем я пошел сLinkedHashMap
+ Collections#synchronizedMap
Реализация я упоминал выше. Приятно осознавать, что я что-то не заметил.
Исходя из полученных ответов, похоже, что лучшим вариантом для LRU с высокой степенью конкуренции будет продлениеConcurrentHashMap используя некоторые из той же логики, котораяLinkedHashMap
использует.