在Cache2k中正确使用cache.putIfAbsent()

时间:2016-07-15 13:51:17

标签: cache2k

我想知道在使用Cache2k缓存时如何使用putIfAbsent()方法。例如,在ConcurrentHashMap中,可以使用如下方法:

Set<X> set = map.get(name);
if (set == null) {
    final Set<X> value = new HashSet<X>();
    set = map.putIfAbsent(name, value);
    if (set == null) {
        set = value;
    }
}

(从Should you check if the map containsKey before using ConcurrentMap's putIfAbsent复制)

Cache2K版本返回一个布尔值。这意味着什么,当多于一个线程使用相同的密钥插入值时,这告诉我什么。

任何帮助都会非常感激,因为我对如何处理这个问题有点不确定。我使用的是0.26-BETA的最新版本。

谢谢和最诚挚的问候, 迈克尔

1 个答案:

答案 0 :(得分:1)

putIfAbsent()相当于:

if (!cache.containsKey(key)) {
  cache.put(key, value);
  return true;
} else {
  return false;
}

除了它以原子方式执行。

如果插入了值(意味着之前不存在),则该方法返回true。由于它是以原子方式执行的,因此只有成功插入值的线程才能获得真值。

请注意,如果已注册,则可以调用作者。如果值已经存在,则不会调用writer。

此方法的语义与JCache / JSR107相同。此行为可能对所有情况都没有意义或直观。请参阅https://github.com/jsr107/jsr107spec/issues/303中的讨论。

如果您愿意,请尝试在另一个关于您的用例或您希望缓存语义的问题中进行解释,以便我们讨论最佳方法。