【问题标题】:Guava cache behavior for requests when an async reload thread is already in progress当异步重新加载线程已经在进行中时请求的 Guava 缓存行为
【发布时间】:2020-08-31 11:53:51
【问题描述】:

从 guava 文档here 中,当收到对刷新时间已过期的缓存键的请求时,如果以这种方式设置并返回现有值,它会启动一个异步线程来刷新该键。我没有从文档中得到的是,当在第一个请求之后立即收到另一个请求并且前一个用于刷新的异步线程仍在运行时会发生什么?会不会-

  1. 返回旧数据并启动另一个异步线程进行刷新或
  2. 它看到另一个刷新线程正在运行,它只是返回旧数据而不产生新线程。

如果行为是第一个,我会担心如果请求率非常高,它最终可能会在后台占用大量资源。

【问题讨论】:

    标签: java caching guava


    【解决方案1】:

    请注意,refreshAfterWrite 的 JavaDoc 状态,

    刷新的语义在LoadingCache.refresh(K)中指定

    这将行为阐明为,

    如果另一个线程当前正在加载 {@code key} 的值,则不执行任何操作而返回。如果与此缓存关联的缓存加载器异步执行刷新,则此方法可能会在刷新完成之前返回。

    缓存足够智能,可以执行 (2),您可以通过编写简单的单元测试轻松验证这一点。

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 1970-01-01
      • 2012-06-22
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      相关资源
      最近更新 更多