番石榴缓存获取和放置行为

时间:2013-12-05 00:55:52

标签: java caching guava

我知道有很多关于Guava Cache的文档,但是还没有找到这个Q的明确答案 - 缓存中已存在一个条目,我用 - 覆盖条目 - cache.put(K,V)

如果另一个线程同时调用cache.get(K),那么缓存会返回什么?它是在put()完成写入之前被阻止还是返回旧值?任何有用的链接/指针都表示赞赏。

1 个答案:

答案 0 :(得分:4)

Guava的Cache课程基于ConcurrentHashMap,因此分享其基本行为。

我认为这不是合同的一部分,但在one of the docs中提到过。为了确保,我查看了源代码,确实是这种情况 - 代码实际上是从ConcurrentHashMap分支出来的。我们将不得不让Guava团队中的某个人进入,以确保没有可能出现错误的极端情况,所以我会默默地认为它总是正确的。

考虑到这一点,答案很简单 - ConcurrentHashMap文档说:

  

检索操作(包括get())通常不会阻塞,因此可能会阻止   与更新操作重叠(包括put()remove())。检索   反映最近已完成更新操作的结果   坚持他们的发作。对于putAll()clear()等集合操作   get(),并发检索可能仅反映插入或删除   一些条目。

因此,在您的特定情况下,{{1}}调用将阻止,并且最有可能返回旧值。