当前位置: 首页 > news >正文

8.Collections.synchronizedMap 与 ConcurrentMap 的区别与适用场景

Collections.synchronizedMap 与 ConcurrentMap 的区别与适用场景

🚀 高频指数:★★★★☆
🎯 你将收获:Java中两种线程安全Map的核心原理、性能差异、使用场景与底层机制。


一、问题导入

💬 面试官:

  1. 你知道 Collections.synchronizedMap()ConcurrentHashMap 的区别吗?
  2. 什么时候该用前者,什么时候该用后者?

很多开发者知道“一个用同步块,一个高并发”,但不清楚它们的本质差异。
这题表面是集合问题,实际上考察的是:锁粒度 + 并发机制 + 线程安全保证层级


二、两者的基本定义

类型来自包出现版本线程安全机制
Collections.synchronizedMap()java.utilJDK 1.2外层整体加锁(synchronized)
ConcurrentHashMapjava.util.concurrentJDK 1.5分桶锁 + CAS + 局部 synchronized

☕️ 口诀:“一个外包锁,一个分区锁。”


三、Collections.synchronizedMap 原理

Collections.synchronizedMap() 是通过装饰器模式包装普通的 Map
在所有访问操作上加 synchronized,保证原子性。

核心实现:

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {return new SynchronizedMap<>(m);
}static class SynchronizedMap<K,V> implements Map<K,V>, Serializable {private final Map<K,V> m;final Object mutex; // 共享锁对象public V get(Object key) {synchronized (mutex) { return m.get(key); }}public V put(K key, V value) {synchronized (mutex) { return m.put(key, value); }}
}

特点:

  • 每次访问(get、put、remove)都加全局锁;
  • 同一时间仅允许一个线程访问 Map;
  • 线程安全但并发性能差
  • 迭代时需手动加锁,否则可能抛出异常。
Map<String,String> map = Collections.synchronizedMap(new HashMap<>());
synchronized (map) {for (String key : map.keySet()) { ... }
}

四、ConcurrentHashMap 原理

ConcurrentHashMap 内部通过 分段锁 + CAS + 局部 synchronized 实现高并发访问。

特点:

  • 读操作无锁;
  • 写操作仅锁定单个桶(Node链表或树);
  • 多线程同时写入不同桶互不影响;
  • 支持弱一致性遍历(不会抛异常)。

✅ 相比 synchronizedMapConcurrentHashMap 性能更高,可并发写入。


五、并发特性对比

对比项Collections.synchronizedMapConcurrentHashMap
线程安全
锁粒度整个Map(全局锁)桶级锁(局部锁)
读操作加锁无锁
写操作加锁CAS + synchronized
并发度1(单线程访问)多线程(默认支持16+并发)
迭代时修改抛 ConcurrentModificationException弱一致性,安全
是否允许 null 键/值
性能表现低并发时可接受高并发性能优越

☕️ 口诀:“同步Map一锁到底,并发Map桶桶分离。”


六、源码差异(简化版)

synchronizedMap:

public V put(K key, V value) {synchronized (mutex) {return m.put(key, value);}
}

ConcurrentHashMap:

final V putVal(K key, V value, boolean onlyIfAbsent) {for (;;) {if (casTabAt(tab, i, null, new Node<>(hash, key, value, null)))break; // 无锁插入成功else synchronized (f) {// 局部锁写入}}
}

七、性能表现(结论)

并发场景建议选择原因
低并发,线程少✅ synchronizedMap简单稳定
高频读写并发✅ ConcurrentHashMap性能高
多线程缓存✅ ConcurrentHashMap支持CAS与分段扩容
迭代读取✅ ConcurrentHashMap支持弱一致性

⚙️ 实际工程中,ConcurrentHashMap 已几乎完全取代 synchronizedMap


八、项目实战建议

  • 缓存在线用户表任务状态表:使用 ConcurrentHashMap
  • 同步块简化低并发配置类 Map:可用 synchronizedMap
  • 迭代同步时,Collections.synchronizedMap 需外层 synchronized (map)
  • 不要在高并发环境下使用 synchronizedMap 做计数器或任务队列。

九、面试官追问清单

面试问题答题要点
线程安全 Map 有哪些?Hashtable、synchronizedMap、ConcurrentHashMap
Hashtable 和 synchronizedMap 区别?Hashtable 内部方法自带 synchronized,前者是装饰器包装。
为什么 ConcurrentHashMap 性能高?分桶锁 + CAS 并发写入,无全局锁。
get 操作是否加锁?synchronizedMap 会加锁;ConcurrentHashMap 不加锁。
允许 null 吗?synchronizedMap 允许,ConcurrentHashMap 不允许。

十、口诀记忆

☕️ “同步一锁全,分桶并发高;读锁卡顿多,CAS 提速跑。”


十一、小结

知识点关键结论
synchronizedMap全局锁,简单但性能差
ConcurrentHashMap分桶锁 + CAS,读写并行
适用场景前者低并发,后者高并发
锁粒度整体 vs 局部
是否推荐新项目中推荐 ConcurrentHashMap

✅ 一句话总结:“synchronizedMap 是老派同步,ConcurrentHashMap 是现代并发。”


🔗 延伸阅读

  • 上一篇:ConcurrentHashMap 全流程解析:从分段锁到 CAS 与 AQS
  • 下一篇:fail-fast 机制与 ConcurrentModificationException 深度剖析
  • 📘 私信关键词【并发MapPDF】获取详细对比表与源码注释。
http://www.dtcms.com/a/611079.html

相关文章:

  • PHP操作redis
  • Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(上)
  • 戴尔的网站建设福州网站建设营销方案
  • Redis 面试题精编(70道|含答案|分类整理)
  • 苏州做公司网站设计的公司网站建设项目执行进度表
  • 发布网站域名设置wordpress 搭建 查分系统
  • 四旋翼无人机视觉目标跟踪系统完整实现指南
  • 网站建设与管理案例柳洪轶苏州保洁公司招聘保洁区域经理
  • 中国核工业华兴建设有限公司网站c蔡甸区城乡建设局网站
  • 如何使用C语言反编译程序 | 反编译技术和注意事项
  • 免费设计签名在线生成网络推广seo怎么弄
  • 威海住房和城乡建设厅网站新国标小区网络建设
  • 河北建设厅官方网站聊城网站建设工作室
  • AURIX与tasking改变字体大小
  • MySQL 条件唯一索引实战:用 delete_time 实现活跃记录唯一
  • ⭐ TIE Cell(Tie-High / Tie-Low)完整技术总结与工程指导
  • 淘宝网站c 设计怎么做wordpress屏蔽右键
  • 苏州网站制作公司合肥建设网
  • 简化接口测试:利用Dify工作流结合CI/CD,实现一键式回归验证
  • 网站建设宣传方案三更app下载网站
  • 济宁祥云网站建设深圳龙华是低风险区吗
  • 如何利用个人nas做网站广州市建设局官方网站
  • Linux内核LED驱动开发:实现可控制闪烁与常亮的GPIO驱动
  • 信息论(四):熵与概率分布的期望
  • 辽宁网站网站建设刚刚中国突然宣布
  • Mysql主从复制 windows下
  • 白云区网站建设公成都建设高端网站
  • UART、IIC、SPI、CAN通信协议简介
  • 鸿蒙系统编译语言 | 深入探讨鸿蒙编译技术及其应用前景
  • 网站建设一对一培训网站建设ssc源码最新