HashMap、HashTable、CurrentHashMap对比

news2025/1/9 15:05:05
  • 😜           :是江迪呀
  • ✒️本文关键词Java集合MapCurrentHashMap
  • ☀️每日   一言坚持自己的风格,面对未知的一切!

在这里插入图片描述

一、HashMapHashTableCurrentHashMap对比

1.1 CurrentHashMapHashMap对比

ConcurrentHashMap就是为了HashMap在多线程下不安全而诞生的,它大量的使用了volatilefinalCASlock-free技术来减少锁竞争对于性能的影响。ConcurrentHashMap避免了对全局加锁改成了局部加锁操作。这样就极大的提高了 并发环境下的操作速度。

所以CurrentHashMap线程是安全的,HashMap线程不安全,在多线程下,使用HashMap进行put操作或造成死循环,导致CPU的利用率接近100%,使用并发情况下不能使用HashMap

1.2 HashMapHashTable对比

HashMapHashTable的实现原理几乎一致,差别是:HashTable不允许keyvaluenull。HashTable是线程安全的。但是Hastable实现线程安全的代价很大,get/put的所有相关操作都是synchronized的,这相当于给hash表加上了一把大锁,多发生多线程操作HashTable时,只要有一个线程操作HashTable其它线程必须阻塞,相当于将所有多线程操作串行化,性能和效率很差。

二、JDK1.7ConcurrentHashMap实现原理

在JDK1.7中ConcurrentHashMap使用的是数组+Segment+分段锁对的方式实现。Segment(分段锁)–减少锁的粒度,ConcurrentHashMap中的分段锁被称为Segment,它类似与 HashMap对的结构,及内部拥有一个Entry数组,数组中的每个元素又是一个链表。同时又是一个ReentrantLock(Segment继承了ReentrantLock

2.1 ConcurrentHashMap的内部结构

ConcurrentHashMap采用分段锁技术,将数据分为一段一段存储, 然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其它段的数据也能被其它线程访问。能够实现真正意义的并发访问,ConcurrentHashMap结构图:
在这里插入图片描述

从上面的结构我们可以看出,ConcurrentHashMap定位一个元素的过程需要进行两次操作。第一次定位到底Segment,第二次定位定位到元素所在的链表的头部。
好处:写操作的时候可以只对元素所在的Segment进行加锁即可,不会影响到 其它的Segment,这样在理想状态下,ConcurrentHashMap可以最高同时支持和Segment数量一样多的写操作(刚好这些写操作都非常平均的分配到,所有的Segment上)并发能力可以大大的提高。
坏处:这种结构带来的副作用就是,存值时的过程要比HashMap要长。Segment的数量是根据并发总量来决定的,比如来说,并发总量是8,那么segment的数量就是8

2.2 为啥JDK1.8版本的ConcurrentHashMap的并发能力可以大大的提高?

JDK8中ConcurrentHashMap采用了数组+链表+红黑树的实现方式来设计,内部采用大量的CAS操作。

CAScompare and swap的缩写,就是比较并交换。CAS是一种基于锁的操作,是乐观锁
锁分为乐观锁悲观锁,悲观锁就是将资源锁住后,等当前获得锁的对象将锁释放后,下一个线程才能访问。而乐观锁采用了宽泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加version来获取数据,性能较悲观锁有很大的提高。
CAS操作包含三个操作数:
(1)内存位置(V);
(2)预期值(A);
(3)新值(B);
如果内存地址里面的值和A的值是一样的,那么就将内存中的值更新成BCAS是通过无限循环来获取数据的,如果第一轮循环中,a线程获取地址里面的值被b线程修改了,那么a线程需要自旋,到下次循环才有可能被执行。

JDK8中彻底放弃了Segment转而采用的是Node。其设计思想不再是1.7中的分段锁机制。
Node:保存key,value以及key的Hash值的数据结构,其中value和next都是用volatile修饰,保证并发内存的可见性。java8中的ConcurrentHashMap的结构基本和Java8中的HashMap一致,不过保证线程安全。在JDK8中的ConcurrentHashMap引入了红黑树,红黑树是一种性能非常好的二叉查找树,其查找性能是O。当ConcurrentHashMap中的链表的长度大于某个阈值(这个阈值是8)的时候将链表转化为红黑树,以提高查询效率。

三、总结

3.1 JDK1.8的ConcurrentHashMap结构和Hashmap的结构比较

JDK1.8的ConcurrentHashMap结构和Hashmap的结构很接近,只是增加了同步操作来控制并发:

  • JDK1.7采用: 数组+Segment+HashEntry
  • JDK1.8采用: Synchronized+CAS+HashEntry+红黑树

3.2 JDK1.7和JDK1.8中的ConcurrentHashMap的比较:

  • 数据结构:放弃了Segment分段锁机制,采用了数组+链表+红黑树
  • 保证线程安全机制: 1.7采用Segment分段锁机制,其中Segment继承ReentrantLock。1.8采用CAS+Synchronized保证线程安全。
  • 锁的粒度: 1.7采用的对响应进行数据操作的Segment加锁,1.8调整为对每个数组元素进行加锁(node)减小了锁的粒度,提高的性能。
  • 链表转化为红黑树。
  • 查询时间复杂度: 从原来的遍历链表O(n),变成遍历红黑树O(LogN)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.多级缓存、JVM进程缓存、Lua语法

多级缓存 文章目录 多级缓存一、多级缓存介绍1.1 传统缓存的问题1.2 多级缓存方案 二、JVM进程缓存2.1 案例准备2.1.1 导入SQL2.1.2 导入item-service项目2.1.3 导入商品查询页面 2.2 初始 Caffeine2.2.1 基本用法 2.3 实现进程缓存 三、Lua语法3.1 初识Lua3.2 变量和循环3.2.1…

这篇文章是用AI大模型自动生成的

昨天用豆包AI大模型尝试生成了一段关于:企业转型、企业转型的要点、企业转型成功的标志,这样的文字。我又加了点自己的思考。 (1)企业转型的原因 企业转型的原因有很多,以下是一些常见的原因: 1. 市场变化&…

针对电子企业的WMS仓储管理系统解决方案

随着全球电子行业的快速发展,电子企业对于仓储管理的需求和挑战也日益增长。WMS仓储管理系统作为电子企业的核心管理工具,需要满足高效率、低成本、高灵活性以及精确控制库存等需求。本文将为电子企业提供一种针对WMS仓储管理系统的解决方案。 一、WMS仓…

Eclipse使用SFTP方式远程连接

安装插件 首先需要安装远程系统连接插件,安装方式可参考: Eclipse安装FTP连接工具_哭哭啼的博客-CSDN博客在过滤器字段中,键入"remote".选择Mobile and Device Development,并选择。找到Remote System Explorer->Connection。…

Outlook邮箱如何设置自动回复

很多小伙伴在刚开始使用Outlook邮箱的时候,不是很清楚Outlook邮箱如何设置自动回复,这里小编就给大家详细介绍一下Outlook邮箱设置自动回复的方法,有需要的小伙伴可以来看一看。 Outlook邮箱设置自动回复的方法: 1、打开软件&am…

ARM-M0内核MCU,内置24bit ADC,采样率4KSPS,传感器、电子秤、体脂秤专用,国产

ARM-M0内核MCU 内置24bit ADC ,采样率4KSPS flash 64KB,SRAM 32KB 适用于传感器,电子秤,体脂秤等等

QML android 采集手机传感器数据 并通过udp 发送

利用 qt 开发 安卓 app &#xff0c;采集手机传感器数据 并通过udp 发送 #ifndef UDPLINK_H #define UDPLINK_H#include <QObject> #include <QUdpSocket> #include <QHostAddress>class UdpLink : public QObject {Q_OBJECT public:explicit UdpLink(QObjec…

Win10无法访问你可能没有权限使用网络资源怎么解决

当我们使用Win10电脑打开文件时&#xff0c;弹出提示无法访问你可能没有权限使用网络资源&#xff0c;这是怎么回事&#xff0c;遇到这种问题应该怎么解决呢&#xff0c;下面小编就给大家详细介绍一下Win10无法访问你可能没有权限使用网络资源的解决方法&#xff0c;有需要的小…

使用亚马逊云科技人工智能内容审核服务,打造安全的图像生成和扩散模型

生成式人工智能技术发展日新月异&#xff0c;现在已经能够根据文本输入生成文本和图像。Stable Diffusion 是一种文本转图像模型&#xff0c;可让您创建栩栩如生的图像应用。您可以通过 Amazon SageMaker JumpStart&#xff0c;使用 Stable Diffusion 模型轻松地从文本生成图像…

继续聊聊API接口

什么是API接口 API接口(Application Programming Interface Interface)是应用程序与开发人员或其他程序互相通信的方式。它允许开发者访问应用程序的数据和功能。 API接口,软件的“握手”与“交流”之道,软件世界的“好基友”。想让软件聊得来?想开发App却无从下手?API来相救…

一文讲清楚:SaaS系统是什么?优势在哪?盘点国内行业龙头SaaS系统!

SaaS系统究竟是什么&#xff1f;应该如何了解SaaS系统&#xff1f;在SaaS系统飞速发展的2023年&#xff0c;国内涌现出了一大批优秀的SaaS系统公司&#xff0c;都有哪些企业位列其中呢&#xff1f;SaaS系统有着什么样独特的竞争力&#xff0c;能够不断发展&#xff0c;成为目前…

无涯教程-JavaScript - NPER函数

描述 NPER函数基于定期,固定付款和固定利率返回投资的期数。 语法 NPER (rate,pmt,pv,[fv],[type])争论 Argument描述Required/OptionalRateThe interest rate per period.RequiredPmt 在每个期间付款。 在年金的使用期限内,它不能改变。 通常,pmt包含本金和利息,但不包含其…

快递物流博览会开幕,多家快递企业黑科技齐聚亮相

快递物流供应链|分拣系统|AGV机器人|新能源物流车|绿色包装|自动识别|冷链物流 2024年4月12-14日 | 杭州国际博览中心 同期展会&#xff1a;2024中国数字物流技术与应用展 2024国际电商物流包装产业展 2024新能源商用车、物流车展 指导单位&#xff1a;浙江省邮政管理局 中…

c++ 学习之类型,常量以及变量的重点知识

const 和 volatile 组合考点 const int ( * ) 等价于 int const ( * ) const int x 1 ; 说明 x 是常量&#xff0c;无法修改 如何区分指针常量和常量指针 指针常量 为 先有指针后有常量 故为 形式如 &#xff1a; int * const p & x ; 且const 修饰的是 p &#xff0c…

Falcon 180B 目前最强大的开源模型

Technology Innovation Institute最近发布了Falcon 180B大型语言模型(LLM)&#xff0c;它击败了Llama-2 70b&#xff0c;与谷歌Bard的基础模型PaLM-2 Large不相上下。 180B是是Falcon 40B模型一个最新版本。以下是该模型的快速概述: 180B参数模型&#xff0c;两个版本(base和…

基于Python+Django实现一个电商购物网站系统

随着互联网的高速发展&#xff0c;电子商务行业也正迎来了其黄金时代。如何搭建一个功能完备、体验良好的电商网站成了许多开发者的关心话题。今天&#xff0c;我将带大家使用Python语言和Django框架&#xff0c;快速打造一个电商购物系统。如果你有一定的Python基础&#xff0…

java Math类中的random方法和Random类中方法的区别

文章目录 Math类中的random()方法Random类 Math类中的random()方法 Math类中的random()方法没有参数&#xff0c;它会默认返回等于0.0、小于1.0的double类型随机数。对double()方法返回的数字稍加处理&#xff0c;即可实现任意范围随机数的功能 public class MathTest {publi…

小白备战大厂算法笔试(六)——堆

文章目录 堆常用操作堆的实现存储与表示访问堆顶元素元素入堆元素出堆 常见应用建堆操作自上而下构建自下而上构建 TOP-K问题遍历选择排序堆 堆 堆是一种满足特定条件的完全二叉树&#xff0c;主要可分为下图所示的两种类型。 大顶堆&#xff1a;任意节点的值 ≥ 其子节点的值…

什么牌子的led台灯质量好?Led台灯品牌质量排行榜

台灯如何选择&#xff0c;随着人们生活水平的提高及科技的不断进步&#xff0c;台灯的品质也得到了极大的提高&#xff0c;在生活中很多时候都需要使用台灯&#xff0c;但是市面上的台灯那么多&#xff0c;台灯如何选择。推荐五款质量高的护眼台灯。 一、书客护眼台灯L1 书客…

Spring学习笔记——4

Spring学习笔记——4 一、基于AOP的声明式事务控制1.1、Spring事务编程概述1.2、搭建测试环境1.3、基于XML声明式事务控制1.4、基于注解声明式事务控制 二、Spring整合web环境2.1、JavaWeb三大组件作用及其特点2.2、Spring整合web环境的思路及实现2.3、Spring的Web开发组件spri…