ConcurrentHashMap融合了Hashmap和Hashtable的優勢,Hashmap是不同步的,但是單線程情況下效率高,Hashtable是同步的同步情況下保證程序執行的正確性。
但Hashtable每次同步執行的時候都要鎖住整個結構,如下圖:
ConcurrentHashMap鎖的方式是細粒度的。ConcurrentHashMap將hash分為16個桶(默認值),諸如get、put、remove等常用操作只鎖住當前需要用到的桶。
ConcurrentHashMap的讀取并發,因為讀取的大多數時候都沒有鎖定,所以讀取操作幾乎是完全的并發操作,只是在求size時才需要鎖定整個hash。
而且在迭代時,ConcurrentHashMap使用了不同于傳統集合的快速失敗迭代器的另一種迭代方式,弱一致迭代器。在這種方式中,當iterator被創建后集合再發生改變就不會拋出ConcurrentModificationException,取而代之的是在改變時new新的數據而不是影響原來的數據,iterator完成后再講頭指針替代為新的數據,這樣iterator時使用的是原來的數據。