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