ConcurrentHashMap底层实现原理

简介: ConcurrentHashMap底层实现原理

1. ConcurrentHashMap的整体架构


image.png

如图,这是ConcurrentHashMap在jdk1.8中的存储结构,它是由数据,单项链表,红黑树来构成,当我们去初始化一个ConcurrentHashMap实例的时候,默认会初始化一个长度等于16的数组,由于ConcurrentHashMap它的核心仍然是Hash表,所以必然会存在Hash冲突的问题,所以ConcurrentHashMap采用链式寻址的方式,来解决Hash表的冲突,当Hash冲突比较多的时候,会造成链表长度较长的问题


这种会使得ConcurrentHashMap中的一个数组元素的查询复杂度会增加,所以在jdk1.8里面,引入了红黑树的机制,当数组长度大于64并且链表长度大于等于8的时候,单向链表会转化成红黑树,另外随着ConcurrentHashMap的一个动态扩容,一旦链表的长度小于8,红黑树会退化成单向链表



2. ConcurrentHashMap的基本功能


image.png

ConcurrentHashMap本质上是一个HashMap,因此功能和HashMap是一样的,但是ConcurrentHashMap在HashMap的基础上提供了并发安全的一个实现。并发安全的主要实现主要通过对于Node节点去加锁,来保证数据更新的安全性



3. ConcurrentHashMap在性能方面的优化


如何在并发性能和数据安全性之间去做好平衡,在很多地方都有类似的设计,比如说cpu的三级缓存,mysql的buffer_poor,Synchronized的一个锁升级等等,ConcurrentHashMap也做了类似一个优化,主要体现在几个方面


  1. 在jdk1.8里面ConcurrentHashMap锁的粒度,是数组中的某一个节点,而在jdk1.7里面。它锁定的是Segment,锁的范围要更大,所以性能上它会更低。


  1. 引入红黑树这样一个机制,去降低了数据查询的时间复杂度,红黑树的时间复杂度实是O(logn)


image.png如图,当数组长度不够的时候,ConcurrentHashMap它需要对数组进行扩容,而在扩容时间上,ConcurrentHashMap引入了多线程并发扩容的一个实现,简单来说多个线程对原始数组进行分片,分片之后,每个线程去负责一个分片的数据迁移,从而去整体的提升了扩容过程中的数据迁移的一个效率


3.ConcurrentHashMap它有一个size()方法来获取总的元素个数,而在多线程并发场景中,在保证原子性的前提下去实现元素个数的累加,性能是非常低的,所以ConcurrentHashMap这个方面做了两个优化


  • (1) image.png

如图,当线程竞争不激烈的时候,直接采用CAS的方式,来实现元素个数的一个递增


  • (2) 如果线程竞争化比较激烈的情况下,使用一个数组来维护元素个数,如果要增加总的元素个数的时候,直接从数组中随机选择一个,在通过CAS算法来实现原子递增,它的核心思想是引入数组来实现并发更新的一个负载



相关文章
|
1月前
|
存储 缓存 安全
面试题-HashMap底层原理与HashTable的区别
字节跳动面试题-HashMap底层原理与HashTable的区别
37 0
|
9月前
|
存储 安全 Java
ConcurrentHashMap底层实现原理
ConcurrentHashMap底层实现原理
149 0
|
9月前
|
存储 算法 安全
HashMap底层实现原理
HashMap底层实现原理
114 0
|
15天前
|
存储 安全 容器
ConcurrentHashMap底层详解
ConcurrentHashMap底层详解
ConcurrentHashMap底层详解
|
19天前
|
存储 算法 Java
HashMap 的实现原理
HashMap 的实现原理
|
1月前
|
存储 安全
ConcurrentHashMap 底层具体实现
ConcurrentHashMap 底层具体实现
|
1月前
|
存储 算法
HashMap的实现原理
HashMap的实现原理
|
11月前
|
存储 安全 Java
ConcurrentHashMap概念与深入理解
ConcurrentHashMap是Java集合框架中的一个重要类,它是线程安全的哈希表实现。相比于普通的HashMap,ConcurrentHashMap在多线程环境中提供了更好的性能和可靠性。本文将详细介绍ConcurrentHashMap的概念、特点以及其内部实现原理。
138 0
|
存储 Java Serverless
HashMap底层原理
1. 基本概念 2. HashMap 的底层数据结构 3. HashMap 的 put 方法流程 4. 怎么计算节点存储的下标 5. Hash 冲突 1)概念 2)解决 hash 冲突的办法 开放地址法 再哈希法 链地址法 建立公共溢出区 6. HashMap 的扩容机制 1)扩容时涉及到的几个属性 2)扩容的条件 3)扩容的简要流程
74 0
|
存储 索引
30. 说一下HashMap的实现原理?中
30. 说一下HashMap的实现原理?中
72 0
30. 说一下HashMap的实现原理?中