当前位置: 首页 > news >正文

ConcurrentHashMap底层具体实现知道吗?实现原理是什么

从这三个方面来回答:
  • ConcurrentHashMap 的整体架构
  • ConcurrentHashMap 的基本功能
  • 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 一样,但是CocurrentHash
Map 在 HashMap 的基础上,提供了并发安全的实现。并发安全的主要实现是通过对指定的 Node节点加锁,来保证数据更新的安全性。

ConcurrentHashMap 在性能方面做的优化

如果在并发性能和数据安全性之间做好平衡,在很多地方都有类似的设计,比如 cpu的三级缓存、mysql 的 buffer_pool、Synchronized 的锁升级等等。ConcurrentHashMap 也做了类似的优化,主要体现在以下几个方面:
  • 在 JDK1.8 中,ConcurrentHashMap 锁的粒度是数组中的某一个节点,而在JDK1.7,锁定的是 Segment,锁的范围要更大,因此性能上会更低。
  • 引入红黑树,降低了数据查询的时间复杂度,红黑树的时间复杂度是 O(logn)。
  • 当数组长度不够时,ConcurrentHashMap 需要对数组进行扩容,在扩容的实现上,ConcurrentHashMap 引入了多线程并发扩容的机制,简单来说就是多个线程对原始数组进行分片后,每个线程负责一个分片的数据迁移,从而提升了扩容过程中数据迁移的效率。

 

  • ConcurrentHashMap 中有一个 size()方法来获取总的元素个数,而在多线程并发场景中,在保证原子性的前提下来实现元素个数的累加,性能是非常低的。ConcurrentHashMap 在这个方面的优化主要体现在两个点:
  1. 当线程竞争不激烈时,直接采用 CAS 来实现元素个数的原子递增。
  2. 如果线程竞争激烈,使用一个数组来维护元素个数,如果要增加总的元素个数,则直接从数组中随机选择一个,再通过 CAS 实现原子递增。它的核心思想是引入了数组来实现对并发更新的负载。

http://www.lryc.cn/news/204414.html

相关文章:

  • Go语言“Go语言:掌握未来编程的利器“
  • 达梦管理工具报错“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”
  • TensorFlow2从磁盘读取图片数据集的示例(tf.keras.utils.image_dataset_from_directory)
  • Unity开发过程中的一些小知识点
  • 大语言模型(LLM)综述(一):大语言模型介绍
  • 在Ubuntu上安装和挂载NFS
  • Python 实现的简易数据库管理系统 (DBMS)
  • 1.初识MySQL
  • 【列存储学习总结】
  • 小记java正则表达式中matcher.find() 和 matcher.matches() 的区别
  • 当中国走进全球化的“深水区”,亚马逊云科技解码云时代的中国式跃升
  • 零基础Linux_21(多线程)页表详解+轻量级进程+pthread_create
  • nodejs+wasm+rust debug及性能分析
  • IP证书针对公网IP签发
  • SpringBoot-集成Minio
  • 【ML】cheatsheet
  • 【字符串】【将字符数组转为字符串】Leetcode 122 路径加密
  • 网络基础知识100问
  • 女孩子就是要打扮漂亮,让童年不留遗憾
  • 实现目录数据的上移(up)、下移(down)、置顶(top)、置底(bottom)的操作
  • Ubuntu 常用命令
  • 如何空手套白狼?一口气省7K再抓住一个7K起步的工作?
  • 电脑主机如何选择内存条
  • 计算机考研自命题(5)
  • 【原创】c语言4种字符串函数的代码测试
  • 扩散模型学习——代码学习
  • redis 数据结构
  • node.js中express框架cookie-parser包设置cookie的问题
  • Docker命令手册
  • Selenium+Pytest自动化测试框架详解