java - Guava:Cacheloader.load() 是如何工作的

标签 java multithreading caching guava

假设我有两个线程,线程 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/

相关文章:

android - 如何在 Android 中设置 IntentService 的优先级

Spring @Cacheable 正在破坏 @RequestMapping

java - 在子类中重写@JsonIgnore

java - 在executeQuery 中放入字符串文字是否容易导致JDBC 中的SQL 注入(inject)?

multithreading - 在 Clojure 的多线程程序中初始化资源的正确方法是什么

Android线程无法访问Main.xml

java - 签名问题 --- openssl_sign

java - 使用java删除另一个双引号内的双引号

php - 如何禁用php中的缓存

ios - 缓存 URL 响应以使用 WKWebView 进行离线查看