hashMap在put值的時候為什麼不是執行緒安全的

2021-09-28 13:49:46 字數 682 閱讀 6871

上面的是hashmap的儲存資料結構,通過給map的key計算hash值,然後決定value放到陣列的對應索引位置上,這樣就可以通過計算key的hash值,直接去陣列中拿到value(所以hashmap是o(1)的複雜度)。

當key衝突(不同的key生成的hash值是 相同的)的時候,就需要把多個value放到同乙個位置,這時候,jdk1.7以前就是通過鍊錶的方式掛在同乙個位置上,jdk1.8以後就是通過平衡樹的方式來代替鍊錶的方式(這樣就是怕出現衝突太多,鍊錶太長,影響hashmap的效能)。

當我們多個執行緒同時插入資料庫的時候就會出現執行緒不安全,putval()是put()方法中呼叫的,我們可以看到紅框框起來的部分,

由於put()和putval()**沒有同步,插入乙個value的時候會進行判空處理,在多執行緒的時候,如果正好2個執行緒都檢查到對應位置是空的,都會插進去的話,先插進去的就會被後插進去的節點覆蓋,而不是都掛在後面。就會出現資料錯誤,導致執行緒不安全

HashMap的Put方法(二)

hashmap類中有如下put方法 方法體省略 public v put k key,v value final v putval int hash,k key,v value,boolean onlyifabsent,boolean evict public void putall map ext...

hashmap 的put與get 筆記

put操作 成員變數 transient entry table entry empty table 陣列 1 資料介面就是陣列 加鍊表 hashmap有 table陣列專門記錄 的就是,正常的put值就是計算出key的hashcode然後找出索引 i 去table陣列中找,如果存在就用單鏈表儲存,...

HashMap的put方法的具體流程

摘抄部分如下 當我們put的時候,首先計算key的hash值,這裡呼叫了hash方法,hash方法實際是讓key.hashcode 與key.hashcode 16進行異或操作,高16bit補0,乙個數和0異或不變,所以 hash 函式大概的作用就是 高16bit不變,低16bit和高16bit做了...