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