JUC_并发映射

ConcurrentMap

ConcurrentMap是java1.5提供的一套应对高并发的映射机制,其数据结构是数组+链表
    主要特点:
    1.因为其应用了分桶/断锁读写锁机制以及无锁算法CAS,在并发的情况下还能保住线程的安全。
    2.当桶中的节点个数大于8个,将桶中的链表转为红黑树。节点个数小于7个时,转为链表。
    3.桶的默认容量是16,加载因子为0.75,默认扩容是增加一倍的桶数。且最多允许存在 2 30 2 ^ {30} 230个桶。

ConcurrentMap是一个接口,其直接实现类有:ConcurrentHashMap, ConcurrentSkipListMap
在这里插入图片描述
ConcurrentHashMap在创建时,提供了可以创建指定初始容量的构造方法:

 /**
     * Creates a new, empty map with an initial table size
     * accommodating the specified number of elements without the need
     * to dynamically resize.
     *
     * @param initialCapacity The implementation performs internal
     * sizing to accommodate this many elements.
     * @throws IllegalArgumentException if the initial capacity of
     * elements is negative
     */
public ConcurrentHashMap(int initialCapacity) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException();
        int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ?
                   MAXIMUM_CAPACITY :
                   tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1));
        this.sizeCtl = cap;
    }

但是通过源码分析得知,并不是你简单粗暴地你给多少容量它就设置多少容量。官方解释是这样的:

Parameters: initialCapacity - The implementation performs internal
sizing to accommodate this many elements.

大概的意思是会进行内部的调整以容纳元素。通过计算,它总会将你设置的容量大小调整为2的某次方( 2 n 2 ^ {n} 2n)形式。比如,给定19,最终计算的实际容量将会是32( 2 5 2 ^ {5} 25)。
其中集体计算细节感兴趣的可以深入研究。

另外一个ConcurrentSkipListMap实现类,数据结构是基于跳跃表实现的,可以极大提升数据的查询速度,适用于查询多,增删少的场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值