ConcurrentHashMap 与 Hashtable 的并发机制有何不同?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
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 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。