0
点赞
收藏
分享

微信扫一扫

企业电子招投标采购系统源码之首页设计

程序小小黑 2023-08-01 阅读 58
java

问题描述

ConcurrentHashMap 底层具体实现以及实现原理


分析维度:


解决方案:

  • ConcurrentHashMap 的整体架构

        如图所示,这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构,它是由数组、 单向链表、红黑树组成。

        当我们初始化一个ConcurrentHashMap实例时,默认会初始化一个长度为16的数组。 由于 ConcurrentHashMap 它的核心仍然是 hash 表,所以必然会存在 hash 冲突问题。         ConcurrentHashMap 采用链式寻址法来解决 hash 冲突。 当 hash 冲突比较多的时候,会造成链表长度较长,这种情况会使得 ConcurrentHashMap 中数据元素的查询复杂度变成 O(n)。因此在 JDK1.8 中,引入了 红黑树的机制。

        当数组长度大于 64 并且链表长度大于等于 8 的时候,单项链表就会转换为红黑树。 另外,随着 ConcurrentHashMap 的动态扩容,一旦链表长度小于 8,红黑树会退化成单向链表。

  • ConcurrentHashMap 的基本功能

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

  • ConcurrentHashMap 在性能方面做的优化

        如果在并发性能和数据安全性之间做好平衡,在很多地方都有类似的设计,比如 cpu 的三级缓存、mysql 的 buffer_pool、Synchronized 的锁升级等等。

        ConcurrentHashMap 也做了类似的优化,主要体现在以下几个方面:

                a、 在 JDK1.8 中,ConcurrentHashMap 锁的粒度是数组中的某一个节点,而在                       JDK1.7,锁定的是 Segment(片段),锁的范围要更大,因此性能上会更低。

                b、引入红黑树,降低了数据查询的时间复杂度,红黑树的时间复杂度是 O(logn)。

                c、(如图所示),当数组长度不够时,ConcurrentHashMap 需要对数组进行扩容,

                        在  扩容的实现上,ConcurrentHashMap 引入了多线程并发扩容的机制, 简单来说

                        就是多个线程对原始数组进行分片后,每个线程负责一个分片的数据迁移,从而提

                        升了扩容过程中数据迁移的效率。

               

                d、ConcurrentHashMap 中有一个 size()方法来获取总的元素个数,而在多线程并发场                        景中,在保证原子性的前提下来实现元素个数的累加,性能是非常低的。                                          ConcurrentHashMap 在这个方面的优化主要体现在两个点:

        

最后

                

举报

相关推荐

0 条评论