有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建ConcurrentMultiMap

我正在尝试基于并发多重映射创建缓存 表现良好: 钥匙串, 价值清单。 此缓存应可用于2个操作:

  1. put()
  2. 入口集()
  3. 清除()

有很多线程可以访问我的缓存。我在谷歌上搜索了一下,找到了一个或许不错的解决方案:

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) 个答案

  1. # 1 楼答案

    在你提到的具体案例中,这个类是有效的。然而,这门课还有很多其他问题。特别是,使用同一密钥的两个put()调用之间可能存在竞争条件,get()操作公开基础映射中的实际列表,这会限制非同步代码的访问