并发容器 - ConcurrentHashMap (待续。。。)

探讨了ConcurrentHashMap中tableSizeFor方法的实现,该方法用于计算给定容量的最接近且大于该容量的2的幂次方数。同时,解析了ConcurrentHashMap构造函数如何根据initialCapacity和loadFactor确定表空间大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


(IDEA 692-700) :tableSizeFor

private static final int MAXIMUM_CAPACITY = 1 << 30;

 

    private static final int tableSizeFor(int c) {
        int n = c - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

求出给定容量的表空间大小。(比如:参数为15,则表空间为16;参数为17,则表空间为32)


(IDEA 836-843) :构造器

    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;
    }

 给定initialCapacity,如果小于0,则抛出异常;如果大于MAXNIMUM_CAPACITY,则等于MAXNIMUM_CAPACITY的值;如果

小于MAXNIMUM_CAPACITY,则等于initialCapacity + 1/2 * initialCapacity + 1


(IDEA  892-902):构造器

    public ConcurrentHashMap(int initialCapacity,
                             float loadFactor, int concurrencyLevel) {
        if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)
            throw new IllegalArgumentException();
        if (initialCapacity < concurrencyLevel)   // Use at least as many bins
            initialCapacity = concurrencyLevel;   // as estimated threads
        long size = (long)(1.0 + (long)initialCapacity / loadFactor);
        int cap = (size >= (long)MAXIMUM_CAPACITY) ?
            MAXIMUM_CAPACITY : tableSizeFor((int)size);
        this.sizeCtl = cap;
    }

如果loadFactor 小于等于 0或者initialCapacity小于0或者并发级别小于等于0,则抛出异常

如果initialCapacity小于并发级别,则initialCapacity等于并发级别

表空间大小为initialCapacity / loadFactor + 1,再去跟MAXIMUM_CAPACITY比较,如果大于MAXIMUM_CAPACITY,则表空间大小等于MAXIMUM_CAPACITY,反之通过tableSizeFor计算实际的表空间大小。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值