1. 程式人生 > >Java併發程式設計 之 HashMap執行緒不安全

Java併發程式設計 之 HashMap執行緒不安全

我想在平時的多執行緒程式設計中,容器的使用是很普遍的,但是你有沒有考慮過有些容器是不安全的,如Haspmap、ArrayList。這裡講解一下Hashmap不安去體現在哪裡。

插入時不安全:

如果有兩個執行緒A和B,都進行插入資料,剛好經過雜湊計算後得到的雜湊碼是一樣的,即插入的位置是一樣的。

假設,執行緒A通過判斷,該位置沒有雜湊衝突,還沒有進行資料插入的時候,CPU就把資源讓給了執行緒B。這時候執行緒B判斷該位置也沒有雜湊衝突,執行緒A的資料還沒插入,就把資料插入了,執行完畢後。執行緒A因為已經判斷過所以直接插入。這時候,執行緒A把執行緒B插入的資料給覆蓋了。發生了執行緒不安全情況。

擴容不安全:

Hashmap的初始容量為16。加入新的鍵值超過限值的時候會呼叫一個resize操作。

當多個執行緒同時檢測到總數量超過門限值的時候就會同時呼叫resize操作,各自生成新的陣列並rehash後賦給該map底層的陣列table,結果最終只有最後一個執行緒生成的新陣列被賦給table變數,其他執行緒的均會丟失。

執行緒安全的容器有:vector、concurrentHashMap、Hashtable。StringBuffer也是執行緒安全的。這就意味著如果在單執行緒中使用這些執行緒安全的容器,效率較其他非執行緒安全容器的會來的慢點。