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

相关文章
相关标签/搜索