Guava:Cacheloader.load()如何工作

时间:2015-07-22 23:14:41

标签: java multithreading caching guava

假设我有两个线程,即线程A和线程B,以及一个空的LoadingCache<String, String>,它的有效期为10分钟。 CacheLoader用于构建LoadingCache以及它从数据库中检索的全部内容。

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

从我在文档中读到的内容:

  

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

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

1 个答案:

答案 0 :(得分:2)

不,加载不会被调用两次;其中一个将获胜,同样的事情发生在第二种情况下,即第二个线程等到第一个线程计算该值,然后选择该值,不需要额外的同步。