Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

ConcurrentHashMap 与 Hashtable 的并发机制有何不同?

查看完整题解

参考回答

直接回答

Hashtable 的常用读写方法同步在同一表对象上;ConcurrentHashMap 面向更高并发访问设计,读取通常不需锁住整个表,并提供单键原子更新方法。两者都拒绝 null。Java 21 的 ConcurrentHashMap 不是旧式固定 Segment 分段锁实现,具体路径要按版本解释。

讲清原理

OpenJDK 21 中,空桶插入可使用 CAS,有竞争的桶更新等路径会使用同步,还可能协助扩容。“使用 CAS”不能推导为所有操作无锁。读取通常不阻塞,并具有 API 规定的单键更新可见性;这也不意味着所有键组成同一时刻的全表快照。

Hashtable 的普通迭代器与 ConcurrentHashMap 的弱一致迭代器约定不同。ConcurrentHashMap 的 size 在并发更新期间反映的是变化中的聚合状态,不适合直接拿来决定必须精确执行一次的业务分支。

例子与易错点

计数可用 ConcurrentHashMap.merge 合并,而不是 get 后手动加一再 put。回调应简短,避免在更新回调里再修改同一映射,尤其不要靠递归更新完成复杂事务。

线程安全并不覆盖值对象内部,也不提供跨多个键的事务。不能把 Hashtable 全局同步与 ConcurrentHashMap 更细的协调机制混成“都有锁所以完全一样”。

相关题:第 22 题、第 32 题、第 39 题、第 45 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。