假设我有两个线程,即线程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只是获取加载的值。这样,不需要同步。这是对的吗?
答案 0 :(得分:2)
不,加载不会被调用两次;其中一个将获胜,同样的事情发生在第二种情况下,即第二个线程等到第一个线程计算该值,然后选择该值,不需要额外的同步。