ConcurrentHashMap 和 Hashtable 如何选用?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
两者都拒绝 null 并支持线程共享,但 ConcurrentHashMap 通常更适合新的并发映射需求:提供单键原子更新、通常不阻塞的读取和弱一致遍历。Hashtable 常用方法围绕同一表同步,更多见于兼容代码。选用时应比较所需原子范围与遍历一致性,而不是只看“都有锁”。
讲清原理
Java 21 的 ConcurrentHashMap 使用多种协调路径,包括 CAS 与桶相关同步,不能再统一解释成旧版 Segment 分段锁。其 compute、merge 等方法对指定键有原子约定;回调仍应短小,避免阻塞和递归修改映射。
弱一致遍历可与更新同时进行,可能反映遍历期间的变化,不是全表某一时刻的快照。Hashtable 的普通迭代器则有快速失败约定;它的 Enumeration 也不自动成为并发快照。不同遍历结果不能只按是否抛异常判断正确性。
例子与易错点
需要并发统计每个词的次数,可以按键 merge;若要求“两个账户余额必须一起改变”,单键原子操作仍不足,应另行设计锁或事务范围。
ConcurrentHashMap 中保存普通可变 List 后,直接修改该 List 不受映射的线程安全保证保护。Hashtable 也一样。容器、值对象和跨键业务操作分别需要匹配的并发策略。
相关题:第 19 题、第 22 题、第 28 题、第 32 题、第 39 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。