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

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.kler.cn/a/375168.html

相关文章:

  • vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了
  • 12. 内存管理
  • BLE 协议之 L2CAP
  • 在canon的生活
  • axios post请求body为字符串时的解决方法
  • java 实现对 word 文档中占位符进行替换
  • Linux高阶——1027—
  • AI产品经理实战手册:策略、开发与商业化指南
  • 2021李宏毅机器学习 1 机器学习基础 笔记
  • 树莓派开发相关知识六 -串口通讯
  • TCP/IP网络编程:理解网络编程和套接字
  • 【面试每日一题之CSS】2、line-height和heigh区别
  • Spring Boot实战:打造现代租房管理系统
  • 如何用猿大师办公助手实现OA系统中Word公文/合同在线编辑及流转?
  • YOLOv6-4.0部分代码阅读笔记-loss_fuseab.py
  • Gitee push 文件
  • 【CRM系统选型指南:国内九大主流工具比较】
  • 专业140+总分430+四川大学854信号与系统考研川大原951电子信息与通信工程,真题,大纲,参考书。
  • 《证据规定》之对鉴定意见异议的处理
  • java项目之基于springboot的疾病防控综合系统的设计与实现(springboot)
  • 微信jssdk在企业微信中失效
  • BGP路径属性与路由反射器
  • 下划线命名转驼峰
  • 链表 算法专题
  • NCCL安装(Ubuntu等)
  • Python -- 网络爬虫