我知道有很多关于Guava Cache
的文档,但是还没有找到这个Q的明确答案 - 缓存中已存在一个条目,我用 - 覆盖条目 -
cache.put(K,V)
如果另一个线程同时调用cache.get(K)
,那么缓存会返回什么?它是在put()
完成写入之前被阻止还是返回旧值?任何有用的链接/指针都表示赞赏。
答案 0 :(得分:4)
Guava的Cache
课程基于ConcurrentHashMap
,因此分享其基本行为。
我认为这不是合同的一部分,但在one of the docs中提到过。为了确保,我查看了源代码,确实是这种情况 - 代码实际上是从ConcurrentHashMap
分支出来的。我们将不得不让Guava团队中的某个人进入,以确保没有可能出现错误的极端情况,所以我会默默地认为它总是正确的。
考虑到这一点,答案很简单 - ConcurrentHashMap
文档说:
检索操作(包括
get()
)通常不会阻塞,因此可能会阻止 与更新操作重叠(包括put()
和remove()
)。检索 反映最近已完成更新操作的结果 坚持他们的发作。对于putAll()
和clear()
等集合操作get()
,并发检索可能仅反映插入或删除 一些条目。
因此,在您的特定情况下,{{1}}调用将不阻止,并且最有可能返回旧值。