工具類中提供了多個可以獲得執行緒安全集合的方法。有vector為什麼還要用copyonwritearraylist(區別)? synchronizedcollection(collectionc)
synchronizedlist(listlist)
synchronizedset(sets)
synchronizedmap(mapm)
synchronizedsortedset(sortedsets)
synchoronizedsortedmap(sortedmapm)
早期版本使用vector,但是因為其使用synchronized互斥鎖,導致效率太低,jdk1.5之後加入copyonwritearraylist,其只有寫加了鎖,讀不加鎖,所以寫寫互斥,讀讀不互斥。
使用方式與arraylist無異
執行緒安全的arraylist,加強版讀寫分離
寫有鎖,讀無鎖
,讀寫之間不阻塞,優於讀寫鎖。寫入時,先copy乙個容器副本,再新增新元素,最後替換引用。
listlist = new copyonwritearraylist();
執行緒安全的set,底層使用的是copyonwritearraylist
實現。
唯一不同在於,使用addifabsent()新增元素,會遍歷陣列 如果存在元素,則不新增(扔掉副本)。
setset = new copyonwritearrayset();
使用方式與hashmap無異。
初始容量預設為理想情況下,支援最大併發16個執行緒。因為每乙個陣列是的乙個元素是上了鎖的,當hashcode計算到元素是存在陣列相同的位置時,競爭同一把鎖,執行緒安全,當不在同乙個位置時,沒有鎖,可以進行操作。16段
(segment),使用分段鎖
設計。不是對整個map加鎖,而是為每個segment加鎖。
當多個物件存入同乙個segment時,才需要互斥。
最理想狀態下為16個物件分別存入16個segment,並行數量為16。
執行緒安全的集合
集合大概有4種型別 list set queue map其中vector hashtable properties是執行緒安全的。其中arraylist linkedlist hashset treeset hashmap treemap等都是執行緒不安全的。執行緒不安全是指 當多個執行緒訪問同乙個...
集合 執行緒安全的HashMap
一 一般模式下執行緒安全的hashmap 預設情況常用的hashmap都是執行緒不安全的,在多執行緒的環境下使用,常常會造成不可預知的,莫名其妙的錯誤。那麼,我們如何實現乙個執行緒安全的hashmap呢?其中乙個可行的方式是使用collectons.synchronizedmap 方法來包裝我們的h...
C 執行緒安全的集合
表示物件的執行緒安全的無序集合。static void main string args thlist.trypeek out int result1 獲取末尾的值 console.writeline string.format count result thlist.count,result1 t...