Предположим, у меня есть многопоточное приложение с 4 потоками, которые совместно используют один (Eh) кэш; в кеше хранятся объекты UserProfile, чтобы каждый раз не извлекать их из базы данных.
Теперь, скажем, все эти 4 потока запрашивают один и тот же UserProfile с ID = 123 в одно и то же время - и он еще не был кэширован. Что нужно сделать, это сделать запрос к базе данных и вставить полученный объект UserProfile в кеш, чтобы его можно было использовать позже.
Однако я хочу добиться того, чтобы только один из этих потоков (первый) запрашивал базу данных и обновлял кэш, а остальные 3 ожидают (очередь) ее завершения ... и затем получают UserProfile. объект с ID = 123 прямо из кеша.
Как вы обычно реализуете такой сценарий? Использование блокировки / транзакций Ehcache ? Или скорее через что-то подобное? (Псевдо-код)
public UserProfile getUserProfile(int id) {
result = ehcache.get(id)
if (result == null) { // not cached yet
synchronized { // queue threads
result = ehcache.get(id)
if (result == null) { // is current thread the 1st one?
result = database.fetchUserProfile(id)
ehcache.put(id, result)
}
}
}
return result
}