第6章 Java并发容器和框架

ConcurrentHashMap简介:

ConcurrentHashMap是线程安全且高效的HashMap,使用锁分段技术提高并发访问率;

ConcurrentHashMap的结构:
ConcurrentHashMap的结构

ConcurrentHashMap包含一个Segment[]数组,每个Segment包含一个HashEntry[]数组,数组中每个元素是由HashEntry组成的链表;

ConcurrentHashMap的初始化:

先根据concurrencyLevel计算出segment数组的大小,再结合initialCapacity计算出segment里HashEntry数组的大小,最后初始化segment、初始化segment数组;

//concurrencyLevel表示并发级别,默认值为16;initialCapacity表示ConcurrentHashMap的容量
public ConcurrentHashMap(int initialCapacity,
                             float loadFactor, int concurrencyLevel) {
        if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)
            throw new IllegalArgumentException();
        if (concurrencyLevel > MAX_SEGMENTS)
            concurrencyLevel = MAX_SEGMENTS;
        // Find power-of-two sizes best matching arguments
        int sshift = 0;
        //ssize是segment数组的长度
        int ssize = 1;
        //ssize通过concurrencyLevel计算得出,是大于等于concurrencyLevel的最小2的N次方值
        while (ssize < concurrencyLevel) {
            ++sshift;
            ssize <<= 1;
        }
        this.segmentShift = 32 - sshift;
        this.segmentMask = ssize - 1;
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        int c = initialCapacity / ssize;
        if (c * ssize < initialCapacity)
            ++c;
        //cap是segment里HashEntry数组的长度
        int cap = MIN_SEGMENT_TABLE_CAPACITY;
        //cap是满足cap*ssize>=initialCapacity条件的最小2的N次方值
        while (cap < c)
            cap <<= 1;
        //segment的容量threshold=cap * loadFactor
        Segment<K,V> s0 =
            new Segment<K,V>(loadFactor, (int)(cap * loadFactor),
                             (HashEntry<K,V>[])new HashEntry[cap]);
        Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize];
        UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0]
        this.segments = ss;
}
segmentShift和segmentMask:

segmentShift用于定位参与散列运算的位数,segmentShift=32-sshift;
segmentMask是散列运算的掩码,segmentShift=ssize-1;
注:ssize=2^sshift

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 引言 ConcurrentHashMap是线程安全并且高效的HashMap,在并发编程中经常可见它的使用,在开始分...
    miaoLoveCode阅读 15,968评论 14 40
  • 概述 还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多面试书中都说到: HashMap...
    winwill2012阅读 5,344评论 3 16
  • 数据结构 ConcurrentHashMap 实现并发操作的原理 使用了锁分段技术:ConcurrentHashM...
    tomas家的小拨浪鼓阅读 5,916评论 0 6
  • 村里土财主朱二家要办喜事,朱二给他那个不争气的儿子娶八姨太太。朱二想到这些年来在这个倒霉的儿子身上花费的钱财...
    去痛片_af8b阅读 2,656评论 0 0
  • 吕太后的原名叫吕雉,她一生不禁让人感慨,从一个温和,善良的贤妻良母,变成了一个残忍,心机的高贵太后。 其实很多人对...
    王泽宇_阅读 3,541评论 0 0