1. 程式人生 > >HashMap執行緒安全問題

HashMap執行緒安全問題

主要集中在put操作和map擴容resize方法上,這2個方法都沒有執行緒同步

1、當多個執行緒向map put時,如果有2個或以上的key(來自不同執行緒)的hash結果一樣(hash碰撞),則只有一個執行緒能put成功,其他執行緒資料丟失

2、map在超過內建的尺寸範圍,則會呼叫resize方法對map擴容,從原始碼中看出是重新建立一個Entry陣列,並重新hash,重新複製元素,再放到table中,如果多個執行緒同時執行這些操作,則只會有一個執行緒擴容後的陣列賦值給table,其他執行緒資料丟失

 

執行緒安全辦法有

1、使用hashtable:加了synchronized關鍵字(同步方法),效率低

2、concurrentHashMap:使用了鎖分段技術,將資料分段加鎖,效率高(jdk8中使用了CAS演算法,拋掉了segment段)

3、synchronizedMap:同樣使用了synchronized關鍵字(同步程式碼塊)