hashmap是线程安全的吗

hashmap是线程安全的吗

hashmap不是线程安全的,往往在写程序时需要通过一些方法来回避,JDK原生提供了2种方式让HashMap支持线程安全

方法1:

通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的。通过Collections.synchronizedMap()来封装所有不安全的HashMap的方法,就连toString、hashCode都进行了封装。使用了synchronized来进行互斥。使用代理模式new了一个新的类,这个类同样实现了Map接口,在Hashmap上面,synchronized锁住的是对象,所以第一个申请的得到锁,其他线程进入阻塞状态。

复制代码
Map<Object, Object> objectObjectMap = Collections.synchronizedMap(new HashMap<>());

优点:代码实现十分简单,一看就懂

缺点:从 锁的角度来看,方法1直接使用了锁住方法,基本是锁住了尽可能大的代码块,性能比较差。

方法2

java.util.concurrent.ConcurrentHashMap,这个方法比方法1有很大进步。重写了HashMap,使用了新的锁机制,把HashMap进行了拆分,拆分成了多个独立的块,这样在高并发的情况下减少了锁冲突的可能。使用的是NonfairSync。这个特性调用CAS指令来确保原子性与互斥性,当如果多个线程恰好操作到同一个segment上面,那么只会有一个线程得到运行。

复制代码
ConcurrentHashMap<Object, Object> objectObjectConcurrentHashMap = new ConcurrentHashMap<>();

优点:

需要互斥的代码段比较少,性能会比较好。ConcurrentHashMap把整个Map切分成了多个块,发生锁碰撞的几率大大降低,性能比较好

缺点:

代码繁琐

相关推荐
圆山猫6 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
城管不管7 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
IT小白杨7 小时前
从环境制备到自动化工作流:多账号运营的工程化架构拆解
java·经验分享·自动化·安全架构·指纹浏览器
豆瓣鸡7 小时前
算法日记 - Day3
java·开发语言·算法
萧瑟余晖7 小时前
Java深入解析篇九之NIO详解
java·网络·nio
The Chosen One9858 小时前
高进度算法模板速记(待完善)
java·前端·算法
极光代码工作室10 小时前
基于SpringBoot的课程预约系统
java·springboot·web开发·后端开发
Leighteen10 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
名字还没想好☜11 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
圆山猫11 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v