当负载执行时调用无效时,Google Guava LoadingCache会执行什么操作?

ams*_*ams 7 concurrency caching guava

我有一个Google番石榴缓存,它从数据库加载数据并使用主键缓存它.我最终从数据库创建的对象是不可变的,构建对象需要访问多个表.在以下场景中会发生什么:

  • 线程1:调用cache.load(10),并根据值为10的数据库主键填充缓存
  • 线程2:用主键10更新数据库行,因此它调用cache.invalidate(10)在cache.load(10)完成之前调用invalidate.

当load(x)执行时调用invalidate(x)时,Guava Loading Cache会做什么?

小智 6

正如当前在Javadoc中指定的那样"在加载完成之前修改与此高速缓存关联的无可观察状态".加载的语义进一步指定为" Cache.asMap().putIfAbsent在加载完成后使用新加载的值添加到缓存中".

您还可以阅读代码以查看调用invalidate或remove时忽略加载条目的位置.


Fra*_*eau 3

那里可能有两种情况:

  • 线程 1 首先到达实际加载点(在 13.0.1 中),并且获取了LocalCache.Segment.lockedGetOrLoad()段锁:在这种情况下,加载完成,锁被释放,计算值返回给调用者,但它将是当线程 2 运行 ( ) 并可以获得时,线程 2 会使其失效。LocalCache.Segment.remove()

  • 线程 2 在线程 1 实际开始加载之前获取了锁:失效实际上并没有执行任何操作,因为该条目尚未存在,然后线程 1 加载最新值。