(Контекст) Мне нужно создать кеш, который загружает информацию из базы данных и делает ее доступной для приложения.Эти данные не будут изменены в этом приложении и будут интенсивно использоваться (извлекаться) многими потоками.Данные могут быть (редко) изменены из другого приложения.Обновление каждые 1 час более чем достаточно.Думаю, что Ehcache подойдет, создав кэш для чтения.
Мысль о некотором кеше, подобном этому:
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("preConfigured",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, ResourcePoolsBuilder.heap(100))
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofHours(1)))
.withLoaderWriter(new CacheDataProvider())).build();
cacheManager.init();
Cache<Integer, String> myCache = cacheManager.getCache("preConfigured", Integer.class, String.class);
Представьте, что срок действия кеша истек (через 1 час), и поток запрашивает запись с ключом 1, а вскоре после этого другой поток запрашиваетта же запись 1. Когда 1-й поток запрашивает запись 1, кэш проверит, что он истек, и попросит LoaderWriter загрузить запись 1.
Мой вопрос: пока LoaderWriter загружает запись 1 для первого запроса, будет ли помещен кэшвторой поток «подождет», пока загрузится запись 1, или второй запрос может снова (почти) одновременно загрузить загрузку для записи 1.То есть в результате одна и та же запись загружается дважды из LoaderWriter?