Guava:Cacheloader.load()如何工作

假设我有两个线程,即线程A和线程B,以及一个空的并且有10分钟到期的LoadingCacheCacheLoader用于构建LoadingCache以及它从数据库中检索的所有内容。

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

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

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

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

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