В этом случае вам следует избегать многократного чтения из кэша, чтобы избежать условий гонки. Вместо этого вы бы написали это как
Entity getEntity(GUID entityId) {
Entity entity = entityLRUCache.get(entityId);
if (entity == null) {
entity = longLoadFromDatabase(entityId);
entityLRUCache.put(entityId, entity);
}
return entity;
}
Это гонка, называемая кэш-давкой, при загрузке значения для заполнения при промахе. Для этой библиотеки можно написать декоратор, используя чередование блокировок или сохраняя фьючерсы, чтобы избежать этого, если возникнут проблемы. Вики-код Google, используемый в качестве примера того, как написать SelfPopulationMap .
ConcurrentLinkedHashMap
слился с гуавой и превратился в кофеин . Вы должны предпочесть ту библиотеку, где вы могли бы написать это как
Entity getEntity(GUID entityId) {
return entityCache.get(entityId, this::longLoadFromDatabase);
}