Hashtable vs ConcurrentHashMap

2023-11-05

来源:黑马教程

Hashtable vs ConcurrentHashMap

要求

  • 掌握 Hashtable 与 ConcurrentHashMap 的区别
  • 掌握 ConcurrentHashMap 在不同版本的实现区别

Hashtable 对比 ConcurrentHashMap

  • Hashtable 与 ConcurrentHashMap 都是线程安全的 Map 集合
  • Hashtable 并发度低,整个 Hashtable 对应一把锁,同一时刻,只能有一个线程操作它
  • ConcurrentHashMap 并发度高,整个 ConcurrentHashMap 对应多把锁,只要线程访问的是不同锁,那么不会冲突

ConcurrentHashMap 1.7

  • 数据结构:Segment(大数组) + HashEntry(小数组) + 链表,每个 Segment 对应一把锁,如果多个线程访问不同的 Segment,则不会冲突。HashEntry里面封装了key、value、next和hash等值。
  • 并发度:Segment 数组大小即并发度,决定了同一时刻最多能有多少个线程并发访问。Segment 数组不能扩容,意味着并发度在 ConcurrentHashMap 创建时就固定了
  • 索引计算
    • 假设大数组长度是 2 m 2^m 2m,key 在大数组内的索引是 key 的二次 hash 值的高 m 位
    • 假设小数组长度是 2 n 2^n 2n,key 在小数组内的索引是 key 的二次 hash 值的低 n 位
  • 扩容:每个小数组的扩容相对独立,小数组在超过扩容因子时会触发扩容,每次扩容翻倍
  • Segment[0] 原型:首次创建其它小数组时,会以此原型为依据,数组长度,扩容因子都会以原型为准

ConcurrentHashMap 1.8

  • 数据结构:Node 数组 + 链表或红黑树,数组的每个头节点作为锁,如果多个线程访问的头节点不同,则不会冲突。首次生成头节点时如果发生竞争,利用 cas 而非 syncronized,进一步提升性能
  • 并发度:Node 数组有多大,并发度就有多大,与 1.7 不同,Node 数组可以扩容
  • 扩容条件:Node 数组满 3/4 时就会扩容
  • 扩容单位:以链表为单位从后向前迁移链表,迁移完成的将旧数组头节点替换为 ForwardingNode
  • 扩容时并发 get
    • 根据是否为 ForwardingNode 来决定是在新数组查找还是在旧数组查找,不会阻塞
    • 如果链表长度超过 1,则需要对节点进行复制(创建新节点),怕的是节点迁移后 next 指针改变
    • 如果链表最后几个元素扩容后索引不变,则节点无需复制
  • 扩容时并发 put
    • 如果 put 的线程与扩容线程操作的链表是同一个,put 线程会阻塞
    • 如果 put 的线程操作的链表还未迁移完成,即头节点不是 ForwardingNode,则可以并发执行
    • 如果 put 的线程操作的链表已经迁移完成,即头结点是 ForwardingNode,则可以协助扩容
  • 与 1.7 相比是懒惰初始化
  • capacity 代表预估的元素个数,capacity / factory 来计算出初始数组大小,需要贴近 2 n 2^n 2n
  • loadFactor 只在计算初始数组大小时被使用,之后扩容固定为 3/4
  • 超过树化阈值时的扩容问题,如果容量已经是 64,直接树化,否则在原来容量基础上做 3 轮扩容
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hashtable vs ConcurrentHashMap 的相关文章

随机推荐

  • 购买专栏请看说明①

    购买专栏请看说明 本专栏只发一些本人得个人意见和看法 以及2021年中职组网络安全得一些思路和 一些做题得看法和经验 购买前记得在csdn 私信我 购买后 也可以发一下自己得做题得资料 但是不 一定 都给 也欢迎大家一起交流哦
  • k8s安全06--sysdig 监控容器云安全

    k8s安全06 sysdig 监控容器云安全 介绍 安装 使用 安装 使用案例 注意事项 说明 介绍 sysdig 是一个比较强大的安全工具 特别适用于容器 K8s 和云环境 也有很多用户觉得它是一个超级系统工具 比 strace tcpd
  • 7. 从0学ARM-GNU伪指令、代码编译,lds使用

    嵌入式工程师到底要不要学习ARM汇编指令 arm学习文章汇总 到底什么是Cortex ARMv8 arm架构 ARM指令集 soc 一文帮你梳理基础概念 科普 关于ARM指令用到的IDE开发环境可以参考下面这篇文章 1 从0开始学ARM 安
  • 黑客帝国效果页面

    效果图如下 代码如下
  • Docker学习研究笔记(三)

    Docker安装 Docker 支持以下的centos 版本 Centos 7 64 bit Centos 6 5 64 bit 目前 centos 仅发行版本的内容支持 docker Docker 运行在 centos 7上 要求系统为6
  • 52道常见Python面试题,你来试一试?

    最近有很多人找小编询问python求职面试的一些情况 python岗位众多 面试官的个性也千人千面 其实是没有固定的套路的 还是一句老话 要成功拿下一个重要的面试 靠的是 台上三分钟 台下几年功 小编虽然没有套路 但是有干货呀 最近整理近一
  • gcc常用选项及常见的文件格式,扩展名

    gcc常用选项 编译过程 预处理 编译 汇编 链接 gcc的选项 必须分开给出 x 语言名 指出后面文件的语言 c 编译 汇编源文件 生成目标文件 S 编译不汇编 生成汇编文件 E 预处理 输出送到标准输出 o 指定输出的文件名 pipe
  • ext4 delay allocation之ext4_writepages页回写源码剖析

    概述 ext4 write写入pagecache之后 再合适的时机会回写到磁盘 ext4文件系统中是通过ext4 writepages写入磁盘 本来将在源码角度分析该过程 建议先参照ext4 delay allocation数据结构 ngi
  • 2022尚硅谷SSM框架跟学(三)MyBatis基础三

    2022尚硅谷SSM框架跟学 三 MyBatis基础三 9 动态SQL 9 1if 9 2where 方法一 加入恒成立的条件 方法二 使用where标签 9 3trim 9 4choose when otherwise 9 5foreac
  • Hive中运行任务报错:Error during job, obtaining debugging information...

    错误 Ended Job job 1545829388777 0070 with errors Error during job obtaining debugging information FAILED Execution Error
  • 华为od机考题目-分苹果

    A B两个人把苹果分成两队 A希望按照他的计算规则等分苹果 他的计算规则时按照二进制加法计算的 并且不计算走位 B的计算规则时十进制加法 包括正常进位 B希望在满足A的情况下获得苹果的重量最多 输入苹果的数量和每个苹果的重量 输出满足A的情
  • 编写程序,输入一个1~7之间的整数,输出该数字对应星期的英文单词。若数字超出范围,输出相应的提示信息。

    编写程序 输入一个1 7之间的整数 输出该数字对应星期的英文单词 若数字超出范围 输出相应的提示信息 例如 输入1输出Monday 输入7输出Sunday 运行结果示例1 运行结果示例2 运行结果示例3 1 7 8 Monday Sunda
  • 真题详解(补码转换)-软件设计(七十四)

    真题详解 索引查询 软件设计 七十三 https blog csdn net ke1ying article details 130659024 Composite模式 以树形结构来表示 整体 部分 的关系 使得单个和团体的使用都具有一致性
  • unity3d asset store 的资源下载到本地的目录

    之前一直不知道unity3d asset stored额资源下载在本地什么目录的 也不知道是不是我用的破解版的原因 下载的资源有一部分导入不成功 包解压错误的消息 我确定是没有中文目录 但是一直无解 本地目录也找不到 照成我长期没办法用as
  • 别踩坑!使用MySQL唯一索引请注意

    背景 在程序设计中 我们往往需要确保数据的唯一性 比如在常见的注册模块 我们需要确保一个手机号只能注册为一个账号 这种情况下 我们的程序往往是第一道关卡 用户来注册之前 首先判断这个手机号是否已经注册 如果已经注册则返回错误信息 或直接去登
  • 122-124

    7 123 冬奥会的好项目 滑雪 while True try R C map int input split mat 高度矩阵 dic 记录每一个高度在矩阵中的位置 ele list 所有高度组成的列表 solution 解矩阵 表示到达
  • 【yarn】yarn客户端与服务端通讯协议ApplicationClientProtocol

    文章目录 1 概述 1 1 应用信息 1 2 资源信息 1 3 集群 节点 配置信息 1 4 队列信息 1 概述 上一篇文章 Yarn yarn源码阅读之ClientRMService 在一篇文章中 我们看到了在创建服务端ClientRMS
  • PHP计算机毕设题目大全

    源码 最新仿金蝶电商ERP进销存系统多仓库版带扫描功能 php网页版BS 14110100931郭婧 旅游网站 1626考勤管理系统 172酒店管理jhne434程序论文 320办公人事亢 413学生社团管理系统Y1A9程序 428志愿者信
  • 怎样访问远程服务器文件夹,访问远程服务器的共享文件夹

    访问远程服务器的共享文件夹 内容精选 换一换 FOTA升级作用 在官方更新新固件后 模组设备无需寄回给官方 而是通过远程FTP HTTP进行OTA升级固件 以更新新固件版本 从而达到更新设备的功能 BUG修复 本次我采用FPT的方式来升级L
  • Hashtable vs ConcurrentHashMap

    来源 黑马教程 Hashtable vs ConcurrentHashMap 要求 掌握 Hashtable 与 ConcurrentHashMap 的区别 掌握 ConcurrentHashMap 在不同版本的实现区别 Hashtable