哪些集合類是執行緒安全的?哪些不安全?

2021-10-07 09:28:08 字數 915 閱讀 2483

線性安全的

vector:只要是關鍵性的操作,方法前面都加了synchronized關鍵字,來保證執行緒的安全性

hashtable:使用了synchronized關鍵字,所以相較於hashmap是執行緒安全的。

concurrenthashmap:使用鎖分段技術確保線性安全,是一種高效但是執行緒安全的集合。

stack:棧,也是執行緒安全的,繼承於vector。

線性不安全的

hashmap

arraylist

linkedlist

hashset

treeset

treemap

hashmap:hashmap在put操作的時候,如果插入的元素超過了容量(由負載因子決定)的範圍就會觸發擴容操作,就是resize,這個會重新將原陣列的內容重新hash到新的擴容陣列中,在多執行緒的環境下,存在同時其他的元素也在進行put操作,如果hash值相同,可能出現同時在同一陣列下用鍊錶表示,造成閉環,導致在get時會出現死迴圈,所以hashmap是執行緒不安全的。

arraylist: list 物件在做 add 時,執行 arrays.copyof 的時候,返回乙個新的陣列物件。當有執行緒 a、b… 同時進入 grow方法,多個執行緒都會執行 arrays.copyof 方法,返回多個不同的 elementdata 物件,假如,a先返回,b 後返回,那麼 list.elementdata ==a. elementdata,如果同時b也返回,那麼 list.elementdata ==b. elementdata,所以執行緒b就把執行緒a的資料給覆蓋了,導致執行緒a的資料被丟失。

linkedlist:與arraylist執行緒安全問題相似,執行緒安全問題是由多個執行緒同時寫或同時讀寫同乙個資源造成的。

hashset:底層資料儲存結構採用了hashmap,所以hashmap會產生的執行緒安全問題hashset也會產生。

哪些集合是執行緒安全的哪些集合不安全

執行緒安全的集合 hashtable concurrenthashmap,vector properties 注意 其他執行緒不安全的集合也可以使collections工具類把它們包裝成執行緒安全的集合 如 list synarraylist collections.synchronizedlist...

不安全的集合類Set

小知識 hashset的底層是hashmap,拋棄了value只用了key 示例 public class listdemo start 休眠等待執行緒跑完 thread.sleep 100 輸出集合數量 system.out.println list的數量為 list.size 示例結果 使用co...

不安全的集合類Map

示例 public class listdemo start 休眠等待執行緒跑完 thread.sleep 100 輸出集合數量 system.out.println map的數量為 map.size 示例結果 使用collections.synchronizedmap newhashmap 將ha...