ConcurrentHashMap實現線程安全的原理

在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中的數據是能夠訪問的。hash

相關文章
相關標籤/搜索