gpt4 book ai didi

java - ConcurrentHashMap#putIfAbsent 但删除项目(如果存在)

转载 作者:行者123 更新时间:2023-11-29 19:10:54 26 4
gpt4 key购买 nike

我有一个 java.util.concurrent.ConcurrentHashMap,如果它不存在,我想放置它,但如果存在,我也想将其删除。像这样的东西:

ConcurrentHashMap<K, V> map = new ConcurrentHashMap<>();
// ...
V value = map.putIfAbsent(k, new V(/* ... */));
if (value != null) {
map.remove(k);
}

当然我希望它是线程安全的。

有没有一种干净的方法可以做到这一点?或者我应该只使用 HashMap 并同步访问?

我的理解是update operations are synchronized anyway ,而且我预计不会出现明显的锁争用,因此添加更多同步并不是什么大问题。

最佳答案

如果性能不是问题,您可以使用带有 ConcurrentHashMap 的装饰器设计模式并添加同步,如下所示:

public class MyMap<K, V> {

private ConcurrentHashMap<K, V> map;

public V put(K key, V value) {
synchronize(map) {
if(map.get(key) != null) {
map.remove(key);
} else {
map.put(key, value);
}
}

public V get(Object key) {
synchronize(map) {
return map.get(key);
}
}
}

如果性能是个问题,您可以实现类似于 ConcurrentHashMap 中实现的优化实现。为此,我建议您看一下 ConcurrentHashMap source code .

关于java - ConcurrentHashMap#putIfAbsent 但删除项目(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45384710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com