CurrentHashMap是執行緒安全的。當多個執行緒同時更新一個數據時不會出現同時獲得修改的情況。在Java7和Java8中結構是不一樣的,Java8中做了很大的最佳化。
1.ConcurrentHashMap採用了陣列+連結串列+Segment+分段鎖的方式實現。
2.加鎖的操作鎖住的是一個 segment,不會對整個結構進行加鎖,其他的Segment 還是可以正常操作的,這樣即保證了執行緒的安全性,又提高了效率。
3.但是定位會比較麻煩,一個元素定位要進行兩次Hash操作,第一次Hash定位到Segment,第二次Hash定位到元素所在的連結串列的頭部。
1.java8中採用了陣列+連結串列+紅黑樹的設計,執行緒安全採用了CAS來實現。
2.原本Java7中採用的Segment加鎖,現調整為對每個陣列元素加鎖。
3.和java8中的hashmap一樣採用了紅黑樹的結構,查詢效率更快。當連結串列節點數量大於8時,會將連結串列轉化為紅黑樹進行儲存,但Hash衝突加劇。
4.查詢時間複雜度:從原來的遍歷連結串列O(n),變成遍歷紅黑樹O(logN)。
CurrentHashMap是執行緒安全的。當多個執行緒同時更新一個數據時不會出現同時獲得修改的情況。在Java7和Java8中結構是不一樣的,Java8中做了很大的最佳化。
Java7中的結構1.ConcurrentHashMap採用了陣列+連結串列+Segment+分段鎖的方式實現。
2.加鎖的操作鎖住的是一個 segment,不會對整個結構進行加鎖,其他的Segment 還是可以正常操作的,這樣即保證了執行緒的安全性,又提高了效率。
3.但是定位會比較麻煩,一個元素定位要進行兩次Hash操作,第一次Hash定位到Segment,第二次Hash定位到元素所在的連結串列的頭部。
Java8中的結構1.java8中採用了陣列+連結串列+紅黑樹的設計,執行緒安全採用了CAS來實現。
2.原本Java7中採用的Segment加鎖,現調整為對每個陣列元素加鎖。
3.和java8中的hashmap一樣採用了紅黑樹的結構,查詢效率更快。當連結串列節點數量大於8時,會將連結串列轉化為紅黑樹進行儲存,但Hash衝突加劇。
4.查詢時間複雜度:從原來的遍歷連結串列O(n),變成遍歷紅黑樹O(logN)。