ConcurrentHashMap结构分析.docxVIP

  • 1
  • 0
  • 约1.45万字
  • 约 23页
  • 2017-01-29 发布于安徽
  • 举报
ConcurrentHashMap结构分析.docx

ConcurrentHashMap结构分析一、ConcurrentHashMap结构为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。ConcurrentHashMap 类中包含两个静态内部类:HashEntry 和 Segment。HashEntry 用来封装映射表的键 / 值对Segment 用来充当锁的角色,每个 Segment 对象守护整个散列映射表的若干个桶。每个桶是由若干个 HashEntry 对象链接起来的链表。一个ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。1.1 HashEntry 类HashEntry 用来封装散列映射表中的键值对。在 HashEntry 类中,key,hash 和 next 域都被声明为 final 型,value 域被声明为 volatile 型。清单 1.HashEntry 类的定义static final class HashEntryK,V { final K key; // 声明 key 为 final 型 final int hash; // 声明 hash 值为 final 型 volatile V value; // 声明 value 为 volatile 型 final HashEntryK,V next; // 声明 next 为 final 型 HashEntry(K key, int hash, HashEntryK,V next, V value) { this.key = key; this.hash = hash; this.next = next; this.value = value; } }在 ConcurrentHashMap 中,(java培训就到源码时代)在散列时如果产生“碰撞”,将采用“分离链接法”来处理“碰撞”:把“碰撞”的 HashEntry 对象链接成一个链表。由于 HashEntry 的 next 域为 final 型,所以新节点只能在链表的表头处插入。 下图是在一个空桶中依次插入 A,B,C 三个 HashEntry 对象后的结构图: 图 1. 插入三个节点后桶的结构示意图:注意:由于只能在表头插入,所以链表中节点的顺序和插入的顺序相反。避免热点域在 ConcurrentHashMap中,每一个 Segment 对象都有一个 count 对象来表示本 Segment 中包含的 HashEntry 对象的个数。这样当需要更新计数器时,不用锁定整个 ConcurrentHashMap。1.2 Segment 类Segment 类继承于 ReentrantLock 类,从而使得 Segment 对象能充当锁的角色。每个 Segment 对象用来守护其(成员对象 table 中)包含的若干个桶。table 是一个由 HashEntry 对象组成的数组。table 数组的每一个数组成员就是散列映射表的一个桶。count 变量是一个计数器,(java培训就到源码时代)它表示每个 Segment 对象管理的 table 数组(若干个 HashEntry 组成的链表)包含的 HashEntry 对象的个数。每一个 Segment 对象都有一个 count 对象来表示本 Segment 中包含的 HashEntry 对象的总数。注意,之所以在每个 Segment 对象中包含一个计数器,而不是在 ConcurrentHashMap 中使用全局的计数器,是为了避免出现“热点域”而影响 ConcurrentHashMap 的并发性。清单 2.Segment 类的定义 static final class SegmentK,V extends ReentrantLock implements Serializable { /** * 在本 segment 范围内,包含的 HashEntry 元素的个数 * 该变量被声明为 volatile 型 */ transient volatile int count; /** * table 被更新的次数 */ transient int modCount; /**

文档评论(0)

1亿VIP精品文档

相关文档