【问题标题】:What does google Guava LoadingCache do when a call is made to invalidate while load is executing?当加载执行时调用无效时,google Guava LoadingCache 会做什么?
【发布时间】:2012-10-14 16:33:04
【问题描述】:

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

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

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

【问题讨论】:

标签: caching concurrency guava


【解决方案1】:

目前在the Javadoc 中指定“在加载完成之前,不会修改与此缓存关联的可观察状态”。加载的语义进一步指定为“加载完成后使用Cache.asMap().putIfAbsent将新加载的值添加到缓存中。”

您还可以阅读the code,了解调用 invalidate 或 remove 时忽略加载条目的位置。

【讨论】:

    【解决方案2】:

    你可以有两种情况:

    • 线程1首先到达实际加载点(13.0.1中的LocalCache.Segment.lockedGetOrLoad()),段锁为acquired:在这种情况下,加载完成,锁为released和计算值返回给调用者,但线程 2 在运行时会使其失效 (LocalCache.Segment.remove()) 并且可以acquire 锁定。

    • 线程 2 在线程 1 实际开始加载之前获得了锁:失效实际上并没有做任何事情,因为条目还不存在,然后线程 1 加载最新的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多