在 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 中的讨论。
如果您愿意,请尝试在另一个问题中解释您的用例或您想要的缓存语义,以便我们讨论最佳方法。
我想知道在使用 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 中的讨论。
如果您愿意,请尝试在另一个问题中解释您的用例或您想要的缓存语义,以便我们讨论最佳方法。