假设我有两个线程,线程A和线程B,以及一个LoadingCache<String, String>为空且有效期为10分钟的CacheLoaderLoadingCache用于构建LoadingCache,它所做的全部工作均从数据库中检索。

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

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


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


为了验证我的理解,如果线程A和线程B之间有5毫秒的差异,那么线程A将自动锁定方法,加载该值,然后线程B会选择加载的值。这样,就不需要同步了。这是正确的吗?

最佳答案

不,负载不会被调用两次;其中一个将获胜,并且与第二种情况相同,这是第二个线程等待直到第一个线程计算出该值,然后获取该值,而无需额外的同步。

09-27 16:54