Блок Spring @Cacheable при доступе к более чем 1 потоку?

Если метод помечен @Cacheable занимает 10 минут для завершения и два потока T1,T2 обращаются к методу.

T1 обращается во время 0 (метод кэша теперь запускается в первый раз) T2 получает доступ во время t1+5mins

означает ли это, что t2 не будет получать доступ к данным в течение приблизительно 5 минут, так как t1 уже начал @Cacheable операция, и она должна завершиться через 5 минут (так как она работает в течение 5 минут) или будет новый вызов @Cacheable вызывается t2?

3 ответов


Если результат первого выполнения не был кэширован,будет продолжен второй вызов.

вы должны понять, что @Cacheable центрируется вокруг содержимого кэша (а не конкретно контекста выполнения потока [ну, вроде; кэш все еще должен быть потокобезопасным]). При выполнении метода кэш сначала проверяется, существует ли ключ: если t1 занимает некоторое время для завершения, его результат не будет кэшироваться, поэтому параллельные выполнения будут действуйте без учета выполнения t1


Как объяснил колосс, кэш проверяется перед вызовом метода. Таким образом, если элемент не находится в кэше (как это будет происходить в T1 + 5 минут), вызов метода произойдет и для потока t2.

в аннотации @Cacheable нет" блокировки". t2 вызовет метод, как если бы был Cache-miss, и, следовательно, t2 также займет 10 минут, чтобы завершить тот же метод.


нет блокировки на @Cacheable.

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

  • для реализации локального кэша используйте ReadWriteLock. Вижу net.sf.ehcache.constructs.blocking.BlockingCache.
  • для реализации удаленного кэша используйте центральный замок гетто.