1

我有一个并发场景,在这里我必须写很多分类的数据结构。Java ConcurrentSkipListMap:自动添加另一个集合对象

我想过使用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); 
} 

的一种方式,当然是创建自己的锁定和保护正常的树形图,但我有这个对象上的真正的高写入速度,我我更喜欢专门为它设计的东西。当然,python的collections.defaultdict就是完美的。

+0

您是否知道使用锁定或同步集合会太慢?你需要多快? (不要说尽可能快; – 2011-12-15 15:03:22

+0

我基本上只是写入这个数据结构,concurrentskiplistmap在这个特定的方面是非常有效的,在写入时允许很好的并发性水平。在TreeMap/RBTree中,我基本上是在整个插入块中串行的。 – marcorossi 2011-12-15 15:06:18

回答

1

一些事情。

第一:最effecient的方式来处理你的看跌期权,如果非存在的情况下是做伪双重检查

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); 
} 

这是effecient,你可以得到看跌-IF-缺席的情况下。

第二:添加到列表中,您仍然遇到并发问题。在放入地图之前,您可能想要将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); 
    } 
相关问题