gpt4 book ai didi

Java ConcurrentSkipListMap : adding atomically another Collection object

转载 作者:太空宇宙 更新时间:2023-11-04 08:26:01 28 4
gpt4 key购买 nike

我有一个并发场景,我必须向排序的数据结构写入很多内容。

出于这个原因,我考虑使用 ConcurrentSkipListMap。我的定义是这样的:ConcurrentSkipListMap<K, List<V>> ,这当然使得管理 List<V> 的插入变得相当困难。当插入第一个元素时。

即:

List<V> list = map.get(k);
if (list == null) {
list = new LinkedList<V>();
map.put(list);
}
list.add(v);

当然这不是原子的。使用类putIfAbsent()方法会使其变得非常尴尬和低效:

List<V> newElement = new LinkedList<V>();
List<V> previous = map.putIfAbsent(k, newElement);
if (previous != null) {
previous.add(v);
} else {
newElement.add(v);
}

一种方法当然是创建自己的锁并保护普通的 TreeMap,但由于我对此对象的写入率非常高,所以我更喜欢专门为其设计的东西。类似 collections.defaultdict当然,使用 python 就完美了。

最佳答案

有几件事。

第一:处理 put-if-absent 情况的最有效方法是进行伪双重检查

public void add(Object key, Object val) {
List list = map.get(key);
if (list == null) {
list = new LinkedList();
List temp = map.putIfAbsent(list);
if (temp != null)
list = temp;
}
list.add(val);
}

对于“如果不存在则放置”的情况,这是最有效的。

第二:添加到列表时仍然存在并发问题。在放入 map 之前,您可能需要将 LinkedList 包装在 Collections.synchronizedList() 中。

public void add(Object key, Object val) {
List list = map.get(key);
if (list == null) {
list = Collections.synchronizedList(new LinkedList());
List temp = map.putIfAbsent(list);
if (temp != null)
list = temp;
}
list.add(val);
}

关于Java ConcurrentSkipListMap : adding atomically another Collection object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8522022/

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