【发布时间】:2026-01-12 10:30:01
【问题描述】:
我需要一个地图的实现, 支持并发,并且只存储最少/最多的附加值(取决于比较器)。 下面的代码可以工作吗?
class LeastValConcurrentMap<K, V> {
//put the least value
private final Comparator<V> comparator;
private final ConcurrentHashMap<K, V> map = new ConcurrentHashMap<K, V>();
LeastValConcurrentMap(Comparator comparator) {
this.comparator = comparator;
}
public void put(K k, V v) {
V vOld = map.put(k, v);
if (vOld == null || comparator.compare(v, vOld) <= 0) //i.e. v <= vOld so better
return;
//recursively call self
put(k, vOld);
}
@Override
public String toString() {
return map.toString();
}
}
您能否举例说明它在哪里/为什么不起作用? 番石榴或标准 java 库中有什么我可以使用的吗?
【问题讨论】:
-
我相信,你想要 V vOld = map.get(k, v);
-
你需要同步 LeastValConcurrentMap
.put(K k, V v) 方法,因为 ConcurrentHashMap 可能是线程安全的,但你的方法不是。 -
你有一个竞争条件。考虑当两个线程同时放置相同的键时会发生什么。即他们都在运行 put()
-
这就是递归方法出现的地方,再次调用自身并检查 v 是否仍然是最小值
-
假设 key:val , concurrentMap 包含 k1:3, thread1 puts val k1:2, vOld = 3 返回, thread2 puts k1:1, (put 是原子的, 在我的理解中), vOld = 2返回...
标签: java guava java.util.concurrent concurrenthashmap