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

ConcurrentHashMap底层实现是什么

ConcurrentHashMap整体结构

        ConcurrentHashMap是一个K-V的存储结构,在JDK1.8中,它的存储结构如下,是由数组、单向链表、红黑树组成。当我们初始化一个实例时,默认会初始化一个长度为16的数组。由于ConcurrentHashMap本质上还是一个hash表,所以key会存在hash冲突,它采用链式寻址法来解决hash冲突。当hash冲突比较多时,会使链表长度过长,因此查询的复杂度就增加。因此JDK1.8中引入了红黑树的算法,当数组长度大于64(源码中MIN_TREEIFY_CAPACITY参数),且链表长度大于等于8时(源码中是TREEIFY_THRESHOLD参数),链表会转化为红黑树。另外随着ConcurrentHashMap的自动扩容,一旦链表长度小于6 时(源码中是:UNTREEIFY_THRESHOLD参数),红黑树又会退化为单向链表。

ConcurrentHashMap的基本功能:

        ConcurrentHashMap本质是一个HashMap,因此功能与HashMap一样,但是ConcurrentHashMap在HashMap的基本上,提供了并发安全的功能。并发安全功能的实现主要是对指定node节点上加锁来保证数据的安全性的。

ConcurrentHashMap所做的优化

        如何在并发性能与安全性上做好平衡,很多地方都会存在类似的设计,比如CPU的三级缓存,mysql的buffer pool,Synchronized的锁升级等。

        在JDK1.8中,ConcurrentHashMap锁的粒度是node,而JDK1.7及以前是对Segment进行锁定,锁粒度大了,性能也会低很多。

        引入红黑树,在hash冲突较大时,会降低查询的时间复杂度,红黑树查询的时间复杂度为O(logn).


http://www.mrgr.cn/news/63790.html

相关文章:

  • 整车功能架构 --- 智能座舱
  • 基于MATLAB驾驶行为的疲劳实时检测研究
  • Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台
  • mac下使用docker安装php7.4环境
  • .net 在线客服系统,到底能不能处理 50万 级消息量,系统架构实践
  • 微信小程序学习实录11:精通表单数据绑定,构建高效用户界面
  • 算法训练(leetcode)二刷第十五天 | 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树
  • 凸极式发电机的相量图分析和计算,内功率因数角和外功率因数角和功角的定义。
  • AnatoMask论文汇总
  • 中国人工智能产业发展联盟发布《基于大模型的数字人系统技术要求》
  • J2:ResNet50v2算法实战与解析
  • CTF顶级工具与资源
  • 市面上12款能帮忙微信记录的数据恢复软件神器!!!
  • Python For循环
  • 再探“构造函数”
  • 备考最后一周调整
  • shodan用法(完)
  • 在 Vue 3 中实现流畅的 Swiper 滑动效果
  • HJ36 字符串加密
  • c++仿函数--通俗易懂
  • 【p2p、分布式,区块链笔记 Torrent】WebTorrent 的lt_donthave插件
  • LeetCode总结-链表
  • 使用TensorFlow进行图像分类
  • 某小型CMS漏洞复现审计
  • Ceisum无人机巡检视频投放
  • NET Core的AOP实施方法1 DispatchProxy