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

缺点:

代码繁琐

相关推荐
牧瀬クリスだ4 分钟前
Mybatis-Plus:让CRUD快如闪电
java·spring boot·spring·tomcat·mybatis·yml
johnny23310 分钟前
JVM生态下Web开发框架:SparkJava、Javalin、Micronaut、SparkKotlin
jvm
盐焗鹌鹑蛋12 分钟前
【Linux】线程概念和控制
java·linux·服务器
CarIise24 分钟前
MyBatis缓存与分页插件:从一级二级缓存到底层原理与PageHelper实战
java·开发语言·spring
宸津-代码粉碎机7 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
噢,我明白了8 小时前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅8 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
考虑考虑8 小时前
synchronized字符串常量
java·后端·java ee
长谷深风1119 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
m0_587383009 小时前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析