假设我有两个线程,线程A和线程B,以及一个LoadingCache<String, String>
为空且有效期为10分钟的CacheLoader
。 LoadingCache
用于构建LoadingCache
,它所做的全部工作均从数据库中检索。
假定LoadingCache.get(key)
仍然为空,并且线程A和线程B同时调用CacheLoader.load()
。 CacheLoader.load()
方法会被调用两次吗?
根据我在文档中阅读的内容:
如果当前正在调用另一个get(K)或getUnchecked(K),
键的值,只需等待该线程完成并返回其值
加载值。请注意,多个线程可以同时加载值
用于不同的键。
为了验证我的理解,如果线程A和线程B之间有5毫秒的差异,那么线程A将自动锁定方法,加载该值,然后线程B会选择加载的值。这样,就不需要同步了。这是正确的吗?
最佳答案
不,负载不会被调用两次;其中一个将获胜,并且与第二种情况相同,这是第二个线程等待直到第一个线程计算出该值,然后获取该值,而无需额外的同步。