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

HashMap 与 Hashtable 的同步边界如何比较?

查看完整题解

参考回答

直接回答

HashMap 不提供内置同步;Hashtable 的常用读写方法同步在表对象上,保护这些单次调用。它们都不能让调用方随意拼接的多步逻辑自动原子化。比较时还要说明 null:HashMap 允许 null 键和值,Hashtable 拒绝;二者也都不保证键的排序。

讲清原理

以“先检查库存,再扣减”为例,检查与扣减若是两个方法调用,其他线程可能在中间插入。同步容器解决了方法内部的竞争,不等于解决整个业务规则。

HashMap 如果始终由一把外部锁保护,也能用于共享场景;若选择 synchronizedMap 包装,则要经包装器访问,并把需要合并的操作放入同一同步范围。读多写多、是否需要原子更新等条件,决定是否更适合 ConcurrentHashMap。

例子与易错点

在 Hashtable 上执行 get(k)、计算新值、再 put(k, value),可能丢掉另一个线程的更新。可按需求选用有明确原子约定的更新方法,或锁住整个操作序列。

“Hashtable 安全,HashMap 危险”过于笼统。线程独占的 HashMap 很正常,错误来自共享方式与所需约束不匹配。也不要把 Hashtable 的旧 Enumeration 当作稳定并发快照。

相关题:第 3 题、第 12 题、第 26 题、第 32 题、第 45 题。

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

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