併發類容器 第二講

2022-08-23 13:45:09 字數 1420 閱讀 5726

跳表的由來:

作用:儲存有序序列,並且實現高效的查詢與插入刪除。

儲存有序序列最簡單的辦法就是使用陣列,從而查詢可以採用二分搜尋,但插入刪除需要移動元素較為低效。

因此出現了二叉搜尋樹,用來解決插入刪除移動元素的問題。但二叉搜尋樹在最壞情況下會退化成一條單鏈表,搜尋的效率降為o(n)。

為了避免二叉搜尋樹的退化,出現了二叉平衡樹,它在每次插入刪除節點後都會重新調整樹形,使得它仍然保持平衡,從而保證了搜尋效率,也保證了插入刪除的效率。

此外,根據平衡演算法的不同,二叉平衡樹又分為:b+樹、b-樹、紅黑樹。

但平衡演算法過於複雜,因此出現跳表。

比較詳細)

簡單總結:

concurrentskiplistmap是執行緒安全的有序的雜湊表,適用於高併發的場景。

concurrentskiplistmap和treemap,它們雖然都是有序的雜湊表。

但是,第一,它們的執行緒安全機制不同,treemap是非執行緒安全的,而concurrentskiplistmap是執行緒安全的。第二,concurrentskiplistmap是通過跳表實現的,而treemap是通過紅黑樹實現的。

關於跳表(skip list),它是平衡樹的一種替代的資料結構,但是和紅黑樹不相同的是,跳表對於樹的平衡的實現是基於一種隨機化的演算法的,這樣也就是說跳表的插入和刪除的工作是比較簡單的。

還算是比較詳細)

簡單總結:

concurrentskiplistset是執行緒安全的有序的集合,適用於高併發的場景。

concurrentskiplistset和treeset,它們雖然都是有序的集合。但是,第一,它們的執行緒安全機制不同,treeset是非執行緒安全的,而concurrentskiplistset是執行緒安全的。第二,concurrentskiplistset是通過concurrentskiplistmap實現的,而treeset是通過treemap實現的。

無界非阻塞佇列,底層是個鍊錶,遵循先進先出原則。

add,offer將元素插入到尾部,

peek

(拿頭部的資料,但是不移除)和

poll

(拿頭部的資料,但是移除)

寫時複製的容器。通俗的理解是當我們往乙個容器新增元素的時候,不直接往當前容器新增,而是先將當前容器進行copy,複製出乙個新的容器,然後新的容器裡新增元素,新增完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對容器進行併發的讀,而不需要加鎖,因為當前容器不會新增任何元素。所以寫時複製容器也是一種讀寫分離的思想,讀和寫不同的容器。如果讀的時候有多個執行緒正在向容器新增資料,讀還是會讀到舊的資料,因為寫的時候不會鎖住舊的,只能保證最終一致性。

適用讀多寫少的併發場景,常見應用:白名單/黑名單,

商品類目的訪問和更新場景。

存在記憶體占用問題。

第二講 容器分類與各種測試

一 容器 分為序列容器 關聯容器 不定續容器 不定續容器 在資料存入容器中,位置不確定 序列容器 都有一定的次序,按照放進去的次序 array 用key來找value就非常快,所以比較適合查詢。vector deque 雙向 list 雙向鍊錶 forward list 單向鍊錶 關聯容器 set ...

同步類容器和併發類容器

同步類容器都是執行緒安全的,但是某些場景下可能需要加鎖來保護復合操作。復合類操作如 迭代 反覆訪問元素,遍歷完容器中所有的元素 跳轉 根據指定的順序找到當前元素的下乙個元素 以及條件運算。這些復合操作在多執行緒併發地修改容器時,可能會表現出意外的行為,最經典的便是concurrentmodifica...

同步類容器和併發類容器

同步類容器都是執行緒安全的,但在某些場景下可能需要加鎖來保護復合操作。復合類操作。如 迭代 反覆訪問元素,遍歷完容器中所有的元素 跳轉 根據指定的順序找到當前元素的下乙個元素 以及條件運算。這些復合操作在多執行緒併發地修改容器時,可能會表現出意外的行為,最經典的便是concurrentmodific...