首先先上ConcurrentHashMap的繼承關(guān)系圖:
可以看到相當(dāng)于HashMap來說少了Cloneable接口菱父,即說明ConcurrentHashMap是不支持clone的
與HashMap相比都實(shí)現(xiàn)了AbstractMap但是ConcurrentHashMap多了增加了自己的一些實(shí)現(xiàn)莲趣,來自于ConcurrentMap接口
put方法實(shí)現(xiàn):
put調(diào)用了putVal方法實(shí)現(xiàn),采用了分段加鎖劲适,即對(duì)當(dāng)前操作的哈希桶進(jìn)行加鎖(通過CAS對(duì)哈希桶首元素加鎖實(shí)現(xiàn)對(duì)整個(gè)哈希桶的加鎖),這樣當(dāng)多線程的情況下相對(duì)于HashTable的全表加鎖來說效率提升了很多,減少了鎖碰撞的概率。
內(nèi)部的實(shí)現(xiàn)和HashTable非常相似拭嫁,除了添加了鎖邏輯處理(類似于U.compareAndSwapObject(tab, ((long)i << ASHIFT) + ABASE, c, v)這種的函數(shù)來處理潛在的并發(fā)問題),同時(shí)在達(dá)到一定閾值的時(shí)候同樣鏈表被轉(zhuǎn)換為紅黑樹抓于,這里和HashMap基本上是一致的(JDK HashMap詳解)