java如何创建ConcurrentMultiMap
我正在尝试基于并发多重映射创建缓存 表现良好: 钥匙串, 价值清单。 此缓存应可用于2个操作:
- put()
- 入口集()
- 清除()
有很多线程可以访问我的缓存。我在谷歌上搜索了一下,找到了一个或许不错的解决方案:
public class Cache<K, V> {
private final ConcurrentMap<K, List<V>> cache = new ConcurrentHashMap<>();
public List<V> get(K k) {
List<V> list = cache.get(k);
return list == null ? new CopyOnWriteArrayList<>() : list;
}
public void put(K k, V v) {
List<V> list = cache.get(k);
if (list == null) {
list = new CopyOnWriteArrayList<>();
List<V> oldList = cache.putIfAbsent(k, list);
if (oldList != null) {
list = oldList;
}
}
list.add(v);
}
public Set<Map.Entry<K, List<V>>> entrySet() {
return cache.entrySet();
}
public void clear() {
cache.clear();
}
}
但我不确定这个解决方案是否真的有效,有人能帮我吗??? 特别是我想知道当两个平行的线程: 1.首先是尝试加入一些元素 2.第二是努力清除所有
这个案子发生了什么
# 1 楼答案
在你提到的具体案例中,这个类是有效的。然而,这门课还有很多其他问题。特别是,使用同一密钥的两个
put()
调用之间可能存在竞争条件,get()
操作公开基础映射中的实际列表,这会限制非同步代码的访问