线程安全的哈希表ConcurrentHashMap

1. HashTable

不推荐使用,无脑给各种方法加锁

2.ConcurrentHashMap

多线程下推荐使用

  1. 锁粒度控制

HashTable直接在方法上加synchronized,相当于对哈希表对象加锁,一个哈希表只有一把锁。多线程环境下,无论线程如何操作哈希表,都会产生锁冲突。
image.png
而ConcurrentHashMap每个哈希桶都有自己的锁,哈希表中哈希桶数量很多,大大降低了锁冲突的概率,性能也大大提升。
image.png

  1. ConcurrentHashMap只对写加锁,读操作不加锁

也就是说两个线程同时修改,才会有锁冲突;两个线程都读,没有锁冲突;一个线程写,一个线程读,也没有锁冲突。
为什么一个线程读一个线程写没有锁冲突?
难道不会读到修改一半的数据吗?ConcurrentHashMap在设计的时候,考虑到这个问题,所以保证在读的时候一定是读到一整数据(要么是旧版本,要么是新版本,不会是读到一半的数据)。
并且读操作也广泛使用volatile保证读到的数据是及时的。

  1. 充分利用CAS特性

像维护元素个数就是通过CAS实现,而不是加锁;以及使用CAS实现轻量级锁/自旋锁等等。

  1. 对扩容进行特殊处理

HashTable的扩容:当put元素时,发现负载因子超过阈值就触发扩容,申请一个更大的数组,把原来旧的数据搬运到新的数组上。
上述扩容方式存在很大问题,当元素个数特别多的时候,搬运操作就会开销非常大。put操作不需要扩容时瞬间完成O(1),但是触发扩容时就可能卡很久。
ConcurrentHashMap的扩容的时候,旧的数组和新的数组是同时存在的,每次进行哈希表操作都会把旧数组上的元素搬运一部分到新数组上,直到全部搬运完,再释放旧的空间。在这个过程中如果要查询元素,旧的数组和新的数组一起查;如果要插入元素,直接往新数组上插入;如果是删除元素,直接删除不用搬运。

  1. 面试题:HashMap,HashTable,ConcurrentHahMap的区别?

先说HashMap是线程不安全的,HashTable,ConcurrentHashMap是线程安全的。
再谈ConcurrentHashMap的优化

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

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

相关文章

深入理解Dubbo-3.高级功能剖析和原理解析

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理🔥如果感觉博主的文章还不错的话&#xff…

利用贝叶斯超参数优化,提升模型效果更科学(附Python代码)

超参数优化在大多数机器学习流水线中已成为必不可少的一步,而贝叶斯优化则是最为广为人知的一种“学习”超参数优化方法。 超参数优化的任务旨在帮助选择学习算法中成本(或目标)函数的一组最佳参数。这些参数可以是数据驱动的(例…

【UE5】初识MetaHuman 创建虚拟角色

步骤 在UE5工程中启用“Quixel Bridge”插件 打开“Quixel Bridge” 点击“MetaHumans-》MetaHuman Presets UE5” 点击“START MHC” 在弹出的网页中选择一个虚幻引擎版本,然后点击“启动 MetaHuman Creator” 等待一段时间后,在如下页面点击选择一个人…

Apipost版IDEA插件:Apipost-Helper

Apipost-Helper是由Apipost推出的IDEA插件,写完接口可以进行快速调试,且支持搜索接口、根据method跳转接口,还支持生成标准的API文档,注意:这些操作都可以在代码编辑器内独立完成,非常好用!这里…

Tair(2):Tair安装部署

1 安装相关依赖库 yum install -y gcc gcc-c make m4 libtool boost-devel zlib-devel openssl-devel libcurl-devel yum:是yellowdog updater modified 的缩写,Linux中的包管理工具gcc:一开始称为GNU C Compiler,也就是一个C编…

N皇后,回溯【java】

问题描述 八皇后问题是十九世纪著名的数学家高斯于1850年提出的。 问题是:在88的棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。可以把八皇后问题扩展到n皇后问题,即在nn的棋盘上摆…

管理类联考——数学——真题篇——按知识分类——几何

文章目录 2023真题(2023-07)-几何-解析几何-最值真题(2023-10)-几何-立体几何-正方体:体积: V = a 3 V=a^3 V

AX和A(T)X的区别是?

目录 1.快速了解的例子: (1)假设所有节点的初始特征都是[1, 0, 0] ,那么AX的结果是: (2) 的结果是: (3) 总结: 2.计算结构系数的例子 (1&#xff09…

day45-46-Vue+ElementUI实现学生管理

VueElementUI实现学生管理 代码: qiushiju/java2313_vue_elementui_crud (gitee.com) 一、思考 考虑需求(登录,查询全部,基本增删改查,分页,搜索,批量) 设计数据库搭建项目 后端…

2024美赛备战2--模型建立(*****必看****)

建模 美赛涉及的建模知识范围非常广且深,纵观美赛真题不难发现,很多的模型 都是读研或者读博的时候才会真正深入开始研究,因此,对于做建模的同学来说, 是无法在赛前吃透大量模型的。推荐本科生分两个步骤去有效准备比赛…

【S32DS RTD实战】-1.3-S32K3工程生成S19,BIN,Hex文件,以及Post-build steps的妙用

目录 1 方法一:逐个生成Motorola S-record(s19,srec…),Intel HEX,Bin文件 1.1 生成Motorola S-record(s19,srec…)文件 1.2 生成Intel HEX文件 1.3 生成Bin文件 2 …

python的Streamlit库的text_input组件

text_input 常用的输入组件,这里注意记录一下具体的参数,方便使用 函数签名 st.text_input(label, value"", max_charsNone, keyNone, type"default", helpNone, autocompleteNone, on_changeNone, argsNone, kwargsNone, *, pla…

【LeetCode】414. 第三大的数

414. 第三大的数 难度:简单 题目 给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 示例 1: 输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。示例 2&#xf…

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密数据恢复

网络技术的不断发展,也为网络安全带来了威胁,近期云天数据恢复中心的工程师陆续接到很多企业的求助,在本月,很多企业的计算机服务器遭到了mkp勒索病毒攻击,导致企业计算机系统瘫痪,无法正常工作&#xff0c…

vue生命周期和路由

Vue.js 生命周期是Vue.js实例从创建到销毁的整个过程中所经过的一系列事件,可以理解为Vue.js的生命周期钩子函数。在这些生命周期钩子函数中,你可以添加自定义的逻辑代码,以便在组件生命周期的不同阶段进行不同的操作。Vue.js生命周期共分为八…

Linux的ps简单实现

原理&#xff1a;遍历下的/proc/%s/task/%s/status所有文件&#xff0c;两个%s都为pid号。 注&#xff1a;多线程下&#xff0c;只打印一个pid/task下的所有目录&#xff0c;即可收集各个线程对应的信息。 $ cat ps.c #include <stdio.h> #include <stdlib.h> #in…

《深入理解计算机系统》学习笔记 - 第四课 - 机器级别的程序

Lecture 05 Machine Level Programming I Basics 机器级别的程序 文章目录 Lecture 05 Machine Level Programming I Basics 机器级别的程序intel 处理器的历史和体系结构芯片的构成AMD 公司(Advanced Micro Devices&#xff0c;先进的微型设备) C, 汇编, 机器代码定义汇编/机器…

2024美赛备战1--数据处理(数据预处理,异常值处理,预测模型,插值拟合 *****必看****)

1.数据预处理 所谓数据预处理&#xff0c;就是指在正式做题之前对数据进行的一些处理。在有些情 况下&#xff0c;出题方提供的数据或者网上查找的数据并不能直接使用&#xff0c;比如缺少数据甚 至是异常数据&#xff0c;如果直接忽略缺失值&#xff0c;或者没发现异常数据&am…

angular material mat-error 失效不展示

1.你命名了控制mat-error显示与否的变量&#xff0c;却没有在html里使用 2.mat-error是放在mat-form-field里才生效的&#xff0c;如果 <input matInput required formControlName"phoneNumber" /> 中的phoneNumber其实是valid&#xff0c;通过验证的&#x…

【KALI】设置静态IP地址

ip: 192.168.1.10/24 网关&#xff1a;192.168.1.1 DNS&#xff1a;192.168.1.254/etc/network/interfaces原始文件内容为&#xff1a; # This file describes the network interfaces available on your system # and how to activate them. For more information, see inter…