论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
安全
›
网络安全
›
线程安全的集合和hashMap
线程安全的集合和hashMap
万万哇
金牌会员
|
2024-8-23 01:45:22
|
显示全部楼层
|
阅读模式
楼主
主题
983
|
帖子
983
|
积分
2949
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
线程安全的集合
Vector
相比较ArrayList,使用了synchronized关键字,线程安全,但是效率低下,不怎么使用
hashTable
相比较hashMap,使用了synchronized关键字,线程安全,但是也不常见
ConcurrentHashMap
相当于hashMap的高并发并线程安全的版本
认识hashMap
1.hashMap的组成
hashMap在jdk1.8之前,底层数据布局由数组和链表组成,在jdk1.8及之后,插入了红黑树,也就是 数组+链表+红黑树。在链表长度达到8时,数组长度达到64,链表会转化为红黑树,链表长度为6时,又会变回链表,而在链表达到8时,数组长度小于64,则可能会优先举行数组扩容。hashMap的负载因子是0.75,扩容为2倍。
jdk1.8之前
jdk1.8及之后
数组+链表
数组+链表+红黑树
头插法
尾插法
负载因子是0.75,扩容为2倍
注:头插法可能会导致,cpu占有率达到100%。如下图,比如在并发扩容情况下,可能会导致扩容时A指向B的同时B指向A,形成死循环。
2. hashMap的put原理
hashMap的put()方法包含了添加和修改这两个功能,这是因为调用put()方法时,起首要根据设定的key值来计算hash值,目的在于计算数组的下标(jdk1.8及之后,hashMap底层数据布局 = 数组 + 链表 + 红黑树),这里会有一个叫哈希辩说的,计算的hash值没有同等,表明没有产生哈希辩说,则表示该数组为空,此时,表示调用的put()方法为添加数据;若哈希辩说了,表示这个key已经存在,就对应位置,将对应的value覆盖,此时,表示调用的put()方法为修改数据。
认识ConcurrentHashMap
1.为什么有ConcurrentHashMap?
通常情况下,我们都会使用hashMap,但它毕竟是线程不安全的,在保证线程安全的情况下,hashTable也可以使用,二则恰恰相反,hashTable效率太低了,而ConcurrentHashMap恰恰保证了这两个优点。ConcurrentHashMap在 jdk1.7 中,它是通太过段锁的方式来实现线程安全的。意思是将哈希表分成许多片段 Segment,而 Segment 本质是一个可重入的互斥锁,所以叫做分段锁;而在 jdk1.8它是 数组+链表+红黑树,采用了 CAS 操作和 synchronized 【保证了并发更新的安全】(synchronized 则是JVM直接支持的,JVM 能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等)来实现的。
2.CAS算法
CAS算法实现无锁化的修改值的操作,他可以大大降低锁代理的性能消耗【可以联想一下乐观锁】。就是不断地去比较当前内存中的变量值与你指定的一个变量值是否相等,如果相等,则接受你指定的修改的值,反之不接受。因为当前线程中的值已经不是最新的值,你的修改很可能会覆盖掉其他线程修改的结果
3.怎么保证线程安全
ConcurrentHashMap只有put()方法中使用了synchronized,在加锁时是使用头结点作为同步锁对象。
4.使用了CAS算法为什么还要synchronized
资源竞争小时,CAS算法是非常适用的,不消举行内核态和用户态之间的线程上下文切换,同时自旋概率也会大大减少,提升性能;当大量线程对同一资源举行写和读操作,自旋概率会大大增加,从而浪费CPU资源,降低性能
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
万万哇
金牌会员
这个人很懒什么都没写!
楼主热帖
markdown day 01
Linux系统调用四、lseek()函数详解 ...
Nacos注册中心-----从0开始搭建和使用 ...
ClickHouse(05)ClickHouse数据类型详解 ...
基于CSDN云和docker全家桶的微服务项目 ...
【云原生】Docker 进阶 -- 数据卷使用 ...
应急救灾物资行业标准与规范 ...
100天精通Python(进阶篇)——第39天 ...
读Java性能权威指南(第2版)笔记02_ J ...
谈谈技术能力
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
程序人生
移动端开发
SQL-Server
鸿蒙
物联网
.Net
用友
DevOps与敏捷开发
快速回复
返回顶部
返回列表