小景哥哥部落格
jdk7 存在死迴圈和資料丟失問題。
資料丟失:
死迴圈:擴容時resize
呼叫transfer
使用頭插法遷移元素,雖然 newtable 是區域性變數,但原先 table 中的 entry 鍊錶是共享的,問題根源是 entry 的 next 指標併發修改,某執行緒還沒有將 table 設為 newtable 時用完了 cpu 時間片,導致資料丟失或死迴圈。
jdk8 在resize
方法中完成擴容,並改用尾插法,不會產生死迴圈,但併發下仍可能丟失資料。可用 concurrenthashmap 或collections.synchronizedmap
包裝成同步集合。
為什麼HashMap不是執行緒安全的
序 最近因為專案的需求,經常會面試一些新人,也就會問他們一些基本的問題,例如,hashmap和hashtable的區別是什麼,一般人想到的就是hashmap不是執行緒安全,這點我想幾乎來面試的人都知道,但是再深入問下為什麼hashmap不是執行緒安全的,幾乎沒有人答上來,當然了,我也不會因為你回答不...
HashMap為什麼是執行緒不安全的
hashmap底層是乙個entry陣列,當發生hash衝突的時候,hashmap是採用鍊錶的方式來解決的,在對應的陣列位置存放鍊錶的頭結點。對鍊錶而言,新加入的節點會從頭結點加入。我們來分析一下多執行緒訪問 1.在hashmap做put操作的時候會呼叫下面方法 新增entry。將 key value...
HashMap為什麼是執行緒不安全的
jdk1.7中hashmap的transfer函式如下 void transfer entry newtable,boolean rehash int i indexfor e.hash,newcapacity e.next newtable i newtable i e e next 此函式tra...