Hashtable和HashMap、ConcurrentHashMap 之间的区别

news2024/11/27 18:23:07

Hashtable和HashMap的区别

        HashMap和Hashtable都是哈希表数据结构,但是Hashtable是线程安全的,HashMap是线程不安全的

        Hashtable实现线程安全就是简单的把关键方法都加上了synchronized关键字

        直接在方法上添加synchronized相当于针对this对象(Hashtable对象)加锁,一个Hashtable只有一把锁,所以当我们对Hashtable执行任何操作的时候都会触发锁冲突,效率是非常低的

        Hashtable是存在很多问题

        1.

        由于直接对方法进行加锁,所以当有很多线程需要访问Hashtable时就会导致严重的锁冲突

         2.

       当我们向Hashtable中添加数据时,对应的size属性应该增加,此时就涉及到多个线程修改同一个变量,存在线程安全问题,而size属性也是通过synchronized来解决线程安全问题的,所以效率会很低

         3.

       哈希表有一个特性,当存放到哈希表中的数据越来越多,冲突率达到一定的数值,就会触发扩容,一旦触发扩容,就会由当前的线程去完成整个扩容过程,这个过程涉及到大量的元素拷贝,效率会很低

        可能会出现一种情况:其他的线程都执行得很流畅,突然有一个线程就卡住了,并且卡了很长的时间,此时这个线程就可能触发了哈希表的扩容,这个扩容过程持续的时间很长

ConcurrentHashMap和Hashtable的区别

        ConcurrentHashMap是线程安全的,并且在多线程编程中ConcurrentHashMap 是比Hashtable实用很多的

        ConcurrentHashMap相比于Hashtable做了很多的优化

        1.

        读操作没有加锁,只对写操作加锁,加锁用的也是synchronized,但是不是直接在方法上进行加锁,而是针对哈希表上的每个链表加锁,并且加锁用的也不是this对象,而是直接用每个链表的头结点作为锁对象进行加锁,相当于哈希表上每个链表都有各自的锁对象

        为什么要这样设计呢?

        因为多个线程对哈希表进行访问时,如果访问的是哈希表上不同的链表,实际上是不会出现线程安全问题的,只有多个线程访问哈希表上的同一个链表才会出现线程安全问题,所以我们不需要对整个哈希表加锁,我们只需要对每个链表进行加锁即可

        加这么多锁不会消耗很多资源吗?

        可能会有细心的小伙伴有这样的问题,但实际上我们用synchronized进行加锁时,一开始加上的是一个偏向锁,偏向锁就相当于是一个标记,此时并没有真正的实例化一个锁出来,也就没有消耗什么资源,只有当多个线程争夺同一把锁(出现锁竞争)时才会去真正的实例化具体的锁,而实际上多个线程去修改同一个链表上的数据,这种情况是很少发生的,所以我们加上的锁大多数都只是一个偏向锁,不消耗什么资源

        2.

        充分利用 CAS 特性. 比如 size 属性通过 CAS 来更新. 避免出现重量级锁的情况.(关于CAS推荐看CAS的ABA问题)

        3.

        优化了扩容方式,化整为零

        当莫一个线程触发了哈希表的扩容操作,此时不需要这个线程完成所有的扩容过程,当前这个线程只需要创建一个更大的哈希表,然后搬运一小部分数据即可

        在扩容的期间,新旧数组是同时存在的,之后每个访问ConcurrentHashMap的线程都会参与对数据的搬运,每个操作负责搬运一部分元素

        在这个期间,我们修改数据会将数据直接修改到新数组上,添加数据会直接添加到新数组上,查找数据是新旧数组一起查找

        当旧数组上的数据被全部搬运完成后,便会删除旧数组

ConcurrentHashMap的锁分段技术

        简单的说就是把若干个哈希桶分成一个 "段" (Segment), 针对每个段分别加锁. 目的也是为了降低锁竞争的概率. 当两个线程访问的数据恰好在同一个段上的时候, 才触发锁竞争.,但现在锁分段技术技术已经被淘汰了,因为要对哈希表的链表进行分段,管理起来是很麻烦的,不如直接对每个链表进行加锁(锁对象是链表的头结点)

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

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

相关文章

Linux cat 的作用

Linux中的cat命令用于连接文件并打印到标准输出设备(通常是终端)。 它的主要作用有以下几点: 查看文件内容:cat命令可用于查看文本文件的内容,将文件的内容从第一行到最后一行打印到终端。 合并文件:cat命…

你们真的感觉Python那么好用吗?

最近一些工作需要用Python来做,我把我遇到的不开心说出来让大家开心开心。PYTHON是一门很伟大的语言,而且有很多有用的框架都是用PYTHON写的!这只是我个人的感受不一定对,别太认真。就当一个故事听! 先说我一些库装了以…

ChatGPT追祖寻宗:GPT-1论文要点解读

论文地址:《Improving Language Understanding by Generative Pre-Training》 最近一直忙着打比赛,好久没更文了。这两天突然想再回顾一下GPT-1和GPT-2的论文, 于是花时间又整理了一下,也作为一个记录~话不多说,让我们…

C. Assembly via Minimums

题目:样例: 输入 5 3 1 3 1 2 10 4 7 5 3 5 3 3 5 2 2 2 2 2 2 2 2 2 2 5 3 0 0 -2 0 -2 0 0 -2 -2输出 1 3 3 10 10 7 5 3 12 2 2 2 2 2 0 -2 0 3 5 思路: 数学思维题,构造算法,这里我们从样例中可以知道,…

当我出现在股友面前,他们笑了,这是来自最佳策略app平台的自信

我的人生就仿佛被提前安排好了一样:三年的自考,三年的打工,五年的炒股等等,这么丰富的履历,小说男主都很少有,可这一切都发生在我的身上。 不知道怎么回事,高考我竟然睡着了,我就这样…

【excel密码】如何保护部分excel单元格?

Excel文件可以设置保护工作表,那么可以只保护工作表中的部分单元格,其他地方可以正常编辑吗?当然是可以的,今天我们学习,如何设置保护部分单元格。 首先,我们先将整张工作表选中(Ctrl A&#…

【RapidAI】P0 项目总览

RapidAI 项目总览 ** 内容介绍 ** Author: SWHL、omahs Github: https://github.com/RapidAI/Knowledge-QA-LLM/ CSDN Author: 脚踏实地的大梦想家 UI Demo: ** 读者须知 ** 本系列博文,主要内容为将 RapidAI 项目逐…

2023欧亚合作发展大会暨国际公共采购大会在京举行

2023年9月2日至6日,以“合作、协同、共赢、共享”为主题的“2023欧亚合作发展大会暨国际公共采购大会等系列会议”在北京炎黄书院隆重举行,共有500多位中外贵宾参加了本次盛会。 本次大会指导单位是中国联合国采购促进会、北京市中医药局,由中…

20套面向对象程序设计选题Java Swing(含教程) (二) 持续更新 建议收藏

20套面向对象程序设计选题Java Swing(含教程) (一) 7. 员工工资管理系统 视频教程: 【课程设计】员工工资管理系统-Java Swing-你的课程我设计 功能描述: 系统员工有"工号"、 “姓名”、“性别”、“岗位”、 "入职年份 "、"…

删除文件PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。

删除文件PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。 问题描述解决方案另外一个问题解决方案 问题描述 是想写一个脚本删除长宽比不对的图片 # coding: utf-8 from PIL import Image, ImageDraw, ImageFont import os import shuti…

Canvas学习01

基础 1、基本概念 Canvas是一个标准的HTML5元素Canvas主要聚焦于2D图形,提供了非常多的JavaScript绘图API(比如:绘制路径、矩形、圆、文本和图像等方法)也可以使用元素对象的 WebGL API 来绘制 2D 和 3D 图形 2、Canvas 优点&a…

AWB-Tuning(1)

一、白平衡的概念 AWB – Auto White Balance 白平衡就是:不管在任何光源下,都能将拍摄的白色物体的图像还原为白色 人眼在早晨、中午、晚上 不同色温下都能准确看到白色。 CMOS 要获得这种能力,必须对每种光源做相应的色彩校准&#xff0c…

asm disk被加入到另外一个磁盘组故障恢复---惜分飞

有朋友在aix环境对其中一个rac的asm磁盘组进行扩容 之后另外一套rac的磁盘组直接dismount Wed Aug 23 12:44:02 2023 NOTE: SMON starting instance recovery for group DATA domain 2 (mounted) NOTE: F1X0 found on disk 0 au 2 fcn 0.128808679 NOTE: SMON skipping disk …

RocketMQ 快速搭建与控制台搭建

一、下载资料及环境准备 这里 下载路径 可以下载对应的版本,本文以 4.9.5 为例:下载这里的Binary 为Linux 安装文件,Source 也下载,方便后续使用。 将下载后的包进行解压: 由于RockerMQ 的建议运行环境较大&#xff…

解决pyside6-uic生成py代码中文为unicode(乱码)的问题

前言 本来想用Java做客户端,后来发现很多算法还是Python有现成的比较方便。 所以最终选择了pyside6。但是用Designer(QT设计师)设计完后,生成的代码中文部分显示为unicode,也可以理解为乱码。 就像这样:…

MybatisPlus 扩展功能 代码生成 逻辑删除 通用枚举 字段类型处理器 配置加密

MybatisPlus 核心功能 条件构造器 自定义SQL Service接口 静态工具_软工菜鸡的博客-CSDN博客 3.扩展功能 3.1.代码生成 在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据…

pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1+cu118 源码编译笔记【2】验证cuda安装 成功

接上篇 pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记_hkNaruto的博客-CSDN博客 由于采用/usr/local/bin/gcc编译,先设置LD_LIBRARY_PATH,再启动python3 export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/…

高德Android高性能高稳定性代码覆盖率技术实践

前言 代码覆盖率(Code coverage)是软件测试中的一种度量方式,用于反映代码被测试的比例和程度。 在软件迭代过程中,除了应该关注测试过程中的代码覆盖率,用户使用过程中的代码覆盖率也是一个非常有价值的指标,同样不可忽视。因为…

Spring 6.0和SpringBoot 3.0新特性

目录 主要更新内容是以下几个: AOT编译 Spring Native GraalVM SpringBoot3生成二进制可执行文件底层流程 主要更新内容是以下几个: A Java 17 baselineSupport for Jakarta EE 10 with an EE 9 baselineSupport for generating native images with…

录音转写和AI质检的区别和使用场景

区别: 录音转写是将语音或录音转化为文本形式的过程。它通常涉及使用自然语言处理技术和语音识别算法来将音频文件中的语音转换为可读的文本格式。 AI质检是一种利用人工智能技术对客户服务、销售和其他电话中心交互进行自动化评估的过程。通过分析和评估客户和代…