concurrentHashMap源碼解讀數組
主要理解幾個問題1 ConcurrentHashMap如何實現分段鎖2 存取數據是否讀寫分離多線程
1 分段鎖的實現併發
①建立默認長度16的segments數組性能
② put方法spa
1 從segments數組獲取segment對象若對象爲空則建立segment對象線程
2 將元素存入segment對象的HashEntry<K,V>table數組下標對象
1) 計算元素存入segment對象的HashEntry<K,V>table數組下標並判斷元素是否已經存在rem
2)建立HashEntry對象並增長元素get
③ remove方法源碼
remove方法和put方法相似
1計算hash值從segments取出segment
2segment加鎖並計算hash值從table中取出元素,而後unsafe將根據下標設置爲null便可
④ get方法
get方法讀取數據不加鎖,能夠多線程併發訪問
總結:
ConcurrentHashMap實現分段鎖的原理
1 在構造方法默認初始化長度16(使用其餘的構造方法能夠指定長度)的segments數組
2 在put中取出單個segment(segment爲空則建立segment對象),而後對segment加鎖,再而後元素存入segment的table數組中
在這種機制下concurrentHashMap相對於HashTable的性能就提升了16倍,由於每一個segment對象都獨立得到一個對象鎖,每一個segment的table的數據均可以獨立併發訪問
用一張簡圖來表示ConcurrentHashMap和HashTable的區別
注意:
1ConcurentHashMap讀寫數據是獨立進行的,不會互相受影響,即讀取和寫入數據都不會由於是否同一個對象或者同一個線程而被互相阻塞,互相不影響
2 寫入數據時,即put方法在同一個對象多線程不能併發訪問,可是不一樣對象多線程能夠併發訪問
下面看截圖爲證