TreeMap\TreeSet和ConcurrentSkipListMap\ConcurrentSkipListSet

ConcurrentSkipListMap提供了一種線程安全的併發訪問的排序映射表。內部是SkipList(跳錶)結構實現,在理論上能夠在O(log(n))時間內完成查找、插入、刪除操作。
SkipList是一種紅黑樹的替代方案,由於SkipList與紅黑樹相比無論從理論和實現都簡單許多,所以得到了很好的推廣。SkipList是基於一種統計學原理實現的,有可能出現最壞情況,即查找和更新操作都是O(n)時間複雜度,但從統計學角度分析這種概率極小。
使用SkipList類型的數據結構更容易控制多線程對集合訪問的處理,因爲鏈表的局部處理性比較好,當多個線程對SkipList進行更新操作(指插入和刪除)時,SkipList具有較好的局部性,每個單獨的操作,對整體數據結構影響較小。而如果使用紅黑樹,很可能一個更新操作,將會波及整個樹的結構,其局部性較差。因此使用SkipList更適合實現多個線程的併發處理。
在非多線程的情況下,應當儘量使用TreeMap。此外對於併發性相對較低的並行程序可以使用Collections.synchronizedSortedMap將TreeMap進行包裝,也可以提供較好的效率。對於高併發程序,應當使用ConcurrentSkipListMap,能夠提供更高的併發度。
所以在多線程程序中,如果需要對Map的鍵值進行排序時,請儘量使用ConcurrentSkipListMap,可能得到更好的併發度。
注意,調用ConcurrentSkipListMap的size時,由於多個線程可以同時對映射表進行操作,所以映射表需要遍歷整個鏈表才能返回元素個數,這個操作是個O(log(n))的操作。

ConcurrentSkipListSet 同理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章