閒來無事! ! 看看HashMap

HashMap1.7 的問題還有1.7 和1.8 的差別。

HashMap 是一個併發不安全的容器,在迭代操作是採用的是fast-fail 機制;在併發添加操作中會出現丟失更新的問題;因爲採用頭插法在併發擴容時會產生環形鏈表的問題,導致CPU 到達100%,甚至宕機。

解決併發問題可以採用

  • Java 類庫提供的Collections 工具包下的Collections.synchronizedMap()方法,返回一個線程安全的Map
  • 或者使用併發包下的 ConcurrentHashMap,ConcurrentHashMap採用分段鎖機制實現線程安全
  • 使用HashTable (不推薦)

Hash1.7 和1.8 最大的不同在於1.8 採用了“數組+鏈表+紅黑樹”的數據結構,在鏈表長度超過8 時,把鏈表轉化成紅黑樹來解決HashMap 因鏈表變長而查詢變慢的問題;其次

  • 在hash 取下標時將1.7 的9次擾動(5次按位與和4次位運算)改爲2次(一次按位與和一次位運算)
  • 1.7 的底層節點爲Entry,1.8 爲node ,但是本質一樣,都是Map.Entry 的實現
  • 還有就是在存取數據時添加了關於樹結構的遍歷更新與添加操作,並採用了尾插法來避免環形鏈表的產生
  • 但是併發丟失更新的問題依然存在。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章