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切分成了多个块,发生锁碰撞的几率大大降低,性能比较好

缺点:

代码繁琐

相关推荐
AI你一生一世3 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影3 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯4 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
海的透彻8 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat8 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习9 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one9 小时前
算法--构造
java·数据结构·算法
SL_staff9 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff10 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko710 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端