假设我有两个线程,线程 A 和线程 B,以及 LoadingCache<String, String>
该文件为空,且有效期为 10 分钟。一个CacheLoader
用于构建LoadingCache
它所做的一切都是从数据库中检索。
假设 LoadingCache
仍然是空的并且 LoadingCache.get(key)
由线程 A 和线程 B 同时调用。请问CacheLoader.load()
方法被调用两次?
根据我在文档中读到的内容:
If another call to get(K) or getUnchecked(K) is currently loading the value for key, simply waits for that thread to finish and returns its loaded value. Note that multiple threads can concurrently load values for distinct keys.
验证一下我的理解,如果线程A和线程B之间有5ms的差异,那么线程A会自动锁定CacheLoader.load()
方法,加载值,然后线程 B 只获取加载的值。这样,就不需要同步了。这是正确的吗?
最佳答案
不,load 不会被调用两次;其中一个将获胜,并且与第二种情况发生相同的事情,即第二个线程等待直到第一个线程计算该值,然后获取该值,不需要额外的同步。
关于java - Guava:Cacheloader.load() 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31575598/