Java多執行緒之同步集合和併發集合

2021-09-03 01:30:56 字數 1183 閱讀 3385

同步集合類

hashtable

vector

同步集合包裝類,collections.synchronizedmap()和collections.synchronizedlist()

併發集合類

concurrenthashmap

copyonwritearraylist

copyonwritehashset

效能

同步集合比併發集合會慢得多,主要原因是鎖,同步集合會對整個may或list加鎖
併發集合的實現原理

concurrenthashmap:把整個map 劃分成幾個片段,只對相關的幾個片段上鎖,同時允許多執行緒訪問其他未上鎖的片段。

copyonwritearraylist:允許多個執行緒以非同步的方式讀,當有執行緒寫的時候它會將整個list複製乙個副本給它。如果在讀多寫少這種對併發集合有利的條件下使用併發集合,這會比使用同步集合更具有可伸縮性。

併發集合的使用建議

一般不需要多執行緒的情況,只用到hashmap、arraylist,只要真正用到多執行緒的時候就一定要考慮同步。所以這時候才需要考慮同步集合或併發集合。

concurrenthashmap實現原理

concurrenthashmap是由segment陣列結構和hashentry陣列結構組成。segment是一種可重入鎖reentrantlock,在concurrenthashmap裡扮演鎖的角色,hashentry則用於儲存鍵值對資料。乙個concurrenthashmap裡包含乙個segment陣列,segment的結構和hashmap類似,是一種陣列和鍊錶結構, 乙個segment裡包含乙個hashentry陣列,每個hashentry是乙個鍊錶結構的元素, 每個segment守護者乙個hashentry陣列裡的元素,當對hashentry陣列的資料進行修改時,必須首先獲得它對應的segment鎖。

什麼是copyonwrite容器

copyonwrite容器即寫時複製的容器。通俗的理解是當我們往乙個容器新增元素的時候,不直接往當前容器新增,而是先將當前容器進行copy,複製出乙個新的容器,然後新的容器裡新增元素,新增完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對copyonwrite容器進行併發的讀,而不需要加鎖,因為當前容器不會新增任何元素。所以copyonwrite容器也是一種讀寫分離的思想,讀和寫不同的容器。

Java多執行緒之同步容器與併發容器

vector hashtable collections.synchronziedxx 基於hashtable,段segement,最大16個 把粒度分細,每個段有自己的鎖 共享變數用volatile關鍵字,第一時間獲得修改資料。從主記憶體讀取,不從工作記憶體讀取 jdk有兩種cow容器 copyo...

JAVA併發程式設計之多執行緒併發同步業務場景與解決方案

假如現在有20個人去售票廳買票,但是只有2個視窗,那麼同時只能有2個人買票,當2個人任意乙個人買好票離開之後,等待的18個人中又會有乙個人可以占用視窗買票 拆解 20個人就是20個執行緒 2個視窗就資源 實際含義就是 怎麼控制同一時間併發數為2 semaphore 訊號量 控制併發執行緒數 注意使用...

Java多執行緒之間實現同步

理解執行緒安全?synchronized用法 死鎖當多個執行緒同時共享,同乙個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。案例 需求現在有100張火車票,有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。class thre...