ConcurrentHashMap介绍

ConcurrentHashMap

ConcurrentHashMap底层原理:

ConcurrentHashMap底层数据结构和HashMap差不多 ,而在产生Hash冲突时使用synchronized加锁来 和CAS模式来保证线程的安全!

 CAS + synchronized + Node + 红黑树

ConcurrentHashMap的重要属性:

private transient volatile int sizeCtl;
当sizeCtl当为负数时,-1 表示正在初始化,-N 表示 N - 1 个线程正在进行扩容;当为 0 时,表示 table 还没有初始化;当为其他正数时,表示初始化或者下一次进行扩容的大小。

构造器:

initialCapacity:表示数组容量 loadFactor 加载因子 concurrencyLevel最大线程 底层保证了initialCapacity>=concurrencyLevel并且 loadFactor是2的次方倍。
并发度:程序运行时能够同时更新 ConccurentHashMap 且不产生锁竞争的最大线程数。默认为 16,且可以在构造函数中设置。当用户设置并发度时,ConcurrentHashMap 会使用大于等于该值的最小2幂指数作为实际并发度(假如用户设置并发度为17,实际并发度则为32)

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

put() 方法

流程:

1、如果没有初始化,就调用 initTable() 方法来进行初始化;
2、如果没有 hash 冲突就直接 CAS 无锁插入;
3、如果需要扩容,就先进行扩容;
4、如果存在 hash 冲突,就加锁来保证线程安全,两种情况:一种是链表形式就直接遍历到尾端插入,一种是红黑树就按照红黑树结构插入;
5、如果该链表的数量大于阀值 8,就要先转换成红黑树的结构,break 再一次进入循环
6、如果添加成功就调用 addCount() 方法统计 size,并且检查是否需要扩容。

扩容机制:

扩容时机:

(1) 元素个数达到扩容阈值。
(2) 调用 putAll 方法,但目前容量不足以存放所有元素时。
(3) 某条链表长度达到8,但数组长度却小于64时。
注意:桶上链表长度达到 8 个或者以上,并且数组长度为 64 以下时只会触发扩容而不会将链表转为红黑树 。

扩容过程:

构建一个nextTable,大小为table的两倍。
把table的数据复制到nextTable中。	
注意:在复制过程支持多线程复制 	

Hashtable和 ConcurrentHashMap的区别:

hashtable和ConcurrentHashMap都是线程安全的 ,但是Hashtable是通过在修改数据时锁住整个HashTable,效率较低 而ConcurrentHashMap是通过原子性的操作保证数据的读取安全,然后再通过发生Hash冲突一个给这个数组位置加锁,锁的力度较小来保证 高并发下的线程安全的,而且他的扩容也是支持多线程扩容的,效率较高,Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值