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); 
    } 
相關問題