如果更多的1个线程访问Spring @Cacheable会阻塞吗?

blu*_*sky 7 java spring caching spring-cache

如果标记的方法@Cacheable需要10分钟才能完成,并且两个线程t1,t2访问该方法.

t1访问时间0(缓存方法现在第一次运行)t2访问在时间t1 + 5mins

这是否意味着t2将不会访问数据大约5分钟,因为t1已经开始@Cacheable操作并且它将在5分钟内完成(因为它已运行5分钟)或者是否会@Cacheable被t2调用新的调用?

小智 10

Spring 4.3开始,您可以通过添加sync = true标志来获得所需的阻塞行为:

@Cacheable(value="cacheName", key="{#keyField1, #keyField2}", sync = true)
Run Code Online (Sandbox Code Playgroud)


kol*_*sus 6

如果第一次执行的结果没有被缓存,第二次调用将继续进行。

您应该了解它@Cacheable以缓存的内容为中心(而不是特别是线程的执行上下文 [嗯,有点;缓存仍然需要是线程安全的])。在执行方法时,首先检查缓存以查看键是否存在:如果 t1 需要一段时间才能完成,则不会缓存其结果,因此将继续并发执行而不考虑 t1 的执行


Lok*_*oki 6

@Cacheable 上没有阻塞。

但是在缓存实现中可以使用阻塞缓存策略。第一个查询发现未命中有责任重建缓存。其他查询会等到缓存重建。

  • 对于本地缓存实现,请使用ReadWriteLock. 请参阅net.sf.ehcache.constructs.blocking.BlockingCache.
  • 对于远程缓存实现,请使用 ghetto 中央锁。