ConcurrentHashMap
- ConcurrentHashMap的整体架构
- ConcurrentHashMap的基本功能
- ConcurrentHashMap在性能方面的优化
concurrentHashMap:
ConcurrentHashMap的整体架构
concurrentHashMap是由数组+链表+红黑树组成
当我们初始化一个ConcurrentHashMap实例时,默认会初始化一个长度为16的数组。
当发生hash冲突时,会使用链式方式解决。
当链式长度大于8且数组长度大于64 并且负载因子达到0.75的时候,链表会转成红黑树。
随着concurrentHashMap的动态扩容,一旦链表长度小于8,红黑树会退化成单向链表。
ConcurrentHashMap的基本功能
ConcurrentHashMap本质就是一个hashMap,因此功能和HashMap一样,但是ConcurrentHashMap在HashMap的基础上提供了并发安全的实现。
并发安全的主要实现是通过对指定的Node节点加锁,来保证数据更新的安全性
ConcurrentHashMap在性能方面的优化
如果在并发性能和数据安全之间做好平衡,在很多地方都有类似的设计,比如cpu的三级缓存,mysql的buffer_pool,synchronzie的锁升级等。
ConcurrentHashMap优化:
1,在jdk1.8中,concurrentHashMap锁的粒度是数组中的某一个节点,而在JDK1.7中,锁定的是segment,锁的范围更大,因此性能会更低。
2,引入了红黑树,降低了数据查询的时间复杂度,Ologn
3,当数组长度长度不够时,ConcurrentHashMap会对数组进行扩容,在扩容的实现上,ConcurrentHashMap引入了多线程并发扩容机制。
简单来说就是多线程对原是数组进行分片后,每个线程负责一个分片的数据迁移,从而提升了扩容过程中的数据迁移效率
4,concurrentHashMap中有一个Size()方法来获取总的元素个数,在多线程并发场景中,在保正原子性的情况下实现元素个数的累加,性能时非常低的。
当并发不高时,直接采用CAS实现元素个数的原子递增。
如果线程竞争激烈,使用一个数组来维护元素个数,如果要增加总的元素个数,则直接从数组中随机取一个,在通过CAS实现原子递增,他的核心思想是引入数组来实现对并发更新的负载