juc
arraylist底層是乙個陣列,預設大小10,超過就擴容,擴原值的一半10+5=15
執行緒不安全,因為add方法沒有加鎖。
不安全案例:
public class containernotsafedemo ,string.valueof(i)).start();}}
}
參考:
add原始碼:
public boolean add(e e) finally
}
解釋寫時複製:
寫操作時,先從原有的陣列中拷貝乙份出來,然後在新的陣列做寫操作,寫完之後,再將原來的陣列引用指向到新陣列。整個add操作都是在鎖的保護下進行的。
讀操作時,如果寫完成且引用指向新陣列,則讀到的是最新資料;否則讀到的是原始陣列資料。可見讀操作是不加鎖的
消耗記憶體。寫操作,拷貝陣列,消耗記憶體,陣列大的話可能導致gc
不能實時讀。拷貝新增需要時間,讀到的可能是舊資料,能保證最終一致性,但不滿足實時要求。
因此,適合讀多寫少的場景。
讀寫分離,提高併發
不能滿則實時性,可保證最終一致性
通過另闢空間,來解決併發衝突
set同理
hashset > collections.synchronizedset() > copyonwritearrayset
且copyonwritearrayset底層還是用的copyonwritearraylist
hashset底層是hashmap, add(key,乙個常量)
map類似
hashmap > collections.synchronizedmap() > concurrenthashmap
JUC併發程式設計(三 不安全的集合類
在併發環境下,我們經常使用的集合類 list map set 其實都是不安全的!list list在單執行緒的情況下是安全的,但是多執行緒的情況下是不安全的,我們來看兩段 單執行緒 多執行緒 通過以上兩段 我們可以看到,在多執行緒情況下會報concurrentmodificationexceptio...
不安全的集合類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...