1. 程式人生 > >ConcurrentHashMap實現線程安全的原理

ConcurrentHashMap實現線程安全的原理

訪問 數據 key 出現 擁有 操作 tab htable segment

在ConcurrentHashMap沒有出現以前,jdk使用hashtable來實現線程安全,但是hashtable是將整個hash表鎖住,所以效率很低下。

ConcurrentHashMap將數據分別放到多個Segment中,默認16個,每一個Segment中又包含了多個HashEntry列表數組,

對於一個key,需要經過三次hash操作,才能最終定位這個元素的位置,這三次hash分別為:

  1. 對於一個key,先進行一次hash操作,得到hash值h1,也即h1 = hash1(key);
  2. 將得到的h1的高幾位進行第二次hash,得到hash值h2,也即h2 = hash2(h1高幾位),通過h2能夠確定該元素的放在哪個Segment;
  3. 將得到的h1進行第三次hash,得到hash值h3,也即h3 = hash3(h1),通過h3能夠確定該元素放置在哪個HashEntry。

每一個Segment都擁有一個鎖,當進行寫操作時,只需要鎖定一個Segment,而其它Segment中的數據是可以訪問的。

ConcurrentHashMap實現線程安全的原理