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

Proper usage of cache.putIfAbsent() in 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 版本 returns 布尔值。当超过 1 个线程使用相同的键插入一个值时,这是什么意思?这告诉我什么。

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

谢谢并致以最诚挚的问候, 迈克尔

putIfAbsent() 等同于:

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

除了它是原子执行的。

方法 returns true,如果值被插入(这意味着它之前不存在)。由于它是原子执行的,只有成功插入值的线程才能获得真实值。

请注意,如果已注册,put 可能会调用编写器。如果该值已经存在,则不会调用编写器。

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

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