ConcurrentSkipListMap/ConcurrentSkipListSet

轉關於ConcurrentSkipListMap 和 ConcurrentSkipListSet 的深度好文, 終於明白了skip List (跳錶)的含義html

http://www.cnblogs.com/skywang12345/p/3498634.htmlnode

http://www.cnblogs.com/skywang12345/p/3498556.html算法

 =====安全

ConcurrentSkipListMap介紹

ConcurrentSkipListMap是線程安全的有序的哈希表,適用於高併發的場景。
ConcurrentSkipListMap和TreeMap,它們雖然都是有序的哈希表。可是,第一,它們的線程安全機制不一樣,TreeMap是非線程安全的,而ConcurrentSkipListMap是線程安全的。第二,ConcurrentSkipListMap是經過跳錶實現的,而TreeMap是經過紅黑樹實現的。
關於跳錶(Skip List),它是平衡樹的一種替代的數據結構,可是和紅黑樹不相同的是,跳錶對於樹的平衡的實現是基於一種隨機化的算法的,這樣也就是說跳錶的插入和刪除的工做是比較簡單的。數據結構

 

ConcurrentSkipListMap原理和數據結構

ConcurrentSkipListMap的數據結構,以下圖所示:併發

說明高併發

先以數據「7,14,21,32,37,71,85」序列爲例,來對跳錶進行簡單說明。spa

跳錶分爲許多層(level),每一層均可以看做是數據的索引,這些索引的意義就是加快跳錶查找數據速度。每一層的數據都是有序的,上一層數據是下一層數據的子集,而且第一層(level 1)包含了所有的數據;層次越高,跳躍性越大,包含的數據越少。
跳錶包含一個表頭,它查找數據時,是從上往下,從左往右進行查找。如今「須要找出值爲32的節點」爲例,來對比說明跳錶和廣泛的鏈表。線程

狀況1:鏈表中查找「32」節點
路徑以下圖1-02所示:指針

須要4步(紅色部分表示路徑)。

 

狀況2:跳錶中查找「32」節點
路徑以下圖1-03所示:

忽略索引垂直線路上路徑的狀況下,只須要2步(紅色部分表示路徑)。


下面說說Java中ConcurrentSkipListMap的數據結構。
(01) ConcurrentSkipListMap繼承於AbstractMap類,也就意味着它是一個哈希表。
(02) Index是ConcurrentSkipListMap的內部類,它與「跳錶中的索引相對應」。HeadIndex繼承於Index,ConcurrentSkipListMap中含有一個HeadIndex的對象head,head是「跳錶的表頭」。
(03) Index是跳錶中的索引,它包含「右索引的指針(right)」,「下索引的指針(down)」和「哈希表節點node」。node是Node的對象,Node也是ConcurrentSkipListMap中的內部類。

=========

ConcurrentSkipListSet介紹

ConcurrentSkipListSet是線程安全的有序的集合,適用於高併發的場景。
ConcurrentSkipListSet和TreeSet,它們雖然都是有序的集合。可是,第一,它們的線程安全機制不一樣,TreeSet是非線程安全的,而ConcurrentSkipListSet是線程安全的。第二,ConcurrentSkipListSet是經過ConcurrentSkipListMap實現的,而TreeSet是經過TreeMap實現的。

 

ConcurrentSkipListSet原理和數據結構

ConcurrentSkipListSet的數據結構,以下圖所示:

說明
(01) ConcurrentSkipListSet繼承於AbstractSet。所以,它本質上是一個集合。
(02) ConcurrentSkipListSet實現了NavigableSet接口。所以,ConcurrentSkipListSet是一個有序的集合。
(03) ConcurrentSkipListSet是經過ConcurrentSkipListMap實現的。它包含一個ConcurrentNavigableMap對象m,而m對象其實是ConcurrentNavigableMap的實現類ConcurrentSkipListMap的實例。ConcurrentSkipListMap中的元素是key-value鍵值對;而ConcurrentSkipListSet是集合,它只用到了ConcurrentSkipListMap中的key!

本站公眾號
   歡迎關注本站公眾號,獲取更多信息