1.多線程環境使用哈希表
HashMap 不行,線程不安全
更靠譜的,Hashtable,在關鍵方法上加了synchronized
后來標準庫又引入了一個更好的解決方案;ConcurrentHashMap
2.HashMap
- 首先HashMap本身線程不安全
- 其次HashMap的key值可以為空(當key為空時,哈希會被賦值為0)
3.Hashtable
這相當于直接針對Hashtable對象本身加鎖
?如果訪問同一個Hashtable就直接造成鎖沖突
?size屬性也是通過synchronized來控制同步,也是比較慢的
? 一旦觸發擴容,就由該線程完成整個擴容工作,這個過程會涉及大量的元素拷貝,效率會非常低
4.ConcurrentHashMap
改進
1)縮小了鎖的粒度
2)充分的使用CAS原子操作,減少一些加鎖
3)優化了擴容?式:化整為零
? 發現需要擴容的線程,只需要創建?個新的數組,同時只搬?個元素過去.
? 擴容期間,新?數組同時存在.
? 后續每個來操作ConcurrentHashMap的線程,都會參與搬家的過程.每個操作負責搬運??部
分元素.
? 搬完最后?個元素再把?數組刪掉.
? 這個期間,插?只往新數組加.
? 這個期間,查找需要同時查新數組和?數組
注;
HashMap 的擴容操作是一把梭 在某一次插入元素操作中,整體完成擴容
ConcurrentHashMap 則是每次操作都只搬運一部分元素