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
就是完美的。
您是否知道使用鎖定或同步集合會太慢?你需要多快? (不要說盡可能快; – 2011-12-15 15:03:22
我基本上只是寫入這個數據結構,concurrentskiplistmap在這個特定的方面是非常有效的,在寫入時允許很好的併發性水平。在TreeMap/RBTree中,我基本上是在整個插入塊中串行的。 – marcorossi 2011-12-15 15:06:18