1.源碼剖析
a.put
b.initTable
2.總結
ConcurrentHashMap的底層原理類似於hashMap8,但它是線程安全的,具體體現
1.爲數組初始化或擴容時,採用CAS去方式多線程修改共享數據
2.爲數組index對應的node賦值時,會將node使用同步代碼塊加鎖
3.若線程1在擴容,其他線程進來後,發現得到的node的hash爲-1,則跑去幫忙擴容
具體:按照指定長度(16)去幫忙,即每個線程按照約定領取自己的任務(數組長度16的index範圍)
做完此次任務,進行判斷是否繼續幫忙
3.對比JDK1.7
看過1.7版本的ConcurrentHashMap源碼的讀者,相信明白,其實現原理是採用分段鎖機制
即,其內部維護了16個segment對象,而segment的功能近似hashtable,所以相當於每個segment內部是線程安全的。
ConcurrentHashMap---->segment----->HashEntry
1.7版本在segment內部實現syc的鎖,而1.8採用cas無鎖機制+node節點的上鎖,使其上鎖粒度更爲精細,效率更高