JAVA之map
阿新 • • 發佈:2019-04-27
算法 一個數 就是 idt span .com mov bubuko 占用
,三個map 在多線程中的表現,map的兩個操作put 和 get ,先看hashtable get 和 put方法前面都加入了 synchronized
1,hashmap,hashtable,ConcurrentHashMap
考問點1,hashmap的數據結構,其數據結構為數組+鏈表,把key進過hash算法得到hashcode, 然後hashcode%數組大小,得到數組相應的位置然後存放,
不同的key進過hash和取模可能會得到相同的數組位置,這就是沖突了,一個數組位置放不下多個數據,這時候就引入了鏈表。
數組長度是根據鏈表長度而擴張,鏈表太長就會帶來性能問題,當超過一定長度就變成紅黑樹,查找起來更快。
於 JDK 1.8 中引入了紅黑樹,底層數據結構由數組+鏈表
變為了數組+鏈表+紅黑樹
,不過本質並未變。
考問點2
所以說hashtable是線程安全的,hashmap沒有synchronized修飾所以線程不安全。
ConcurrentHashMap是使用了鎖分段技術來保證線程安全的。鎖分段技術:首先將數據分成一段一段的存儲,然後給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問。
ConcurrentHashMap提供了與Hashtable和SynchronizedMap不同的鎖機制。Hashtable中采用的鎖機制是一次鎖住整個hash表,從而在同一時刻只能由一個線程對其進行操作;而ConcurrentHashMap中則是一次鎖住一個桶。
ConcurrentHashMap默認將hash表分為16個桶,諸如get、put、remove等常用操作只鎖住當前需要用到的桶。這樣,原來只能一個線程進入,現在卻能同時有16個寫線程執行,並發性能的提升是顯而易見的。
圖片來自網絡轉載
JAVA之map