【问题标题】:Guava: How does Cacheloader.load() work番石榴:Cacheloader.load() 是如何工作的
【发布时间】:2015-07-22 23:14:41
【问题描述】:

假设我有两个线程,线程 A 和线程 B,以及一个空的 LoadingCache<String, String>,其有效期为 10 分钟。 CacheLoader 用于构建 LoadingCache,它所做的一切都是从数据库中检索的。

假设LoadingCache 仍然是空的并且LoadingCache.get(key) 被线程A 和线程B 同时调用。 CacheLoader.load() 方法会被调用两次吗?

根据我在文档中阅读的内容:

如果另一个调用 get(K) 或 getUnchecked(K) 当前正在加载 键的值,只是等待该线程完成并返回其 加载值。请注意,多个线程可以同时加载值 用于不同的键。

为了验证我的理解,如果线程 A 和线程 B 之间有 5ms 的差异,那么线程 A 会自动锁定 CacheLoader.load() 方法,加载值,然后线程 B 只是拾取加载的值。有了这个,同步就没有必要了。是这样吗?

【问题讨论】:

    标签: java multithreading caching guava


    【解决方案1】:

    不,load 不会被调用两次;其中一个会获胜,并且会发生与第二种情况相同的情况,即第二个线程等待第一个线程计算该值,然后获取该值,不需要额外的同步。

    【讨论】:

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