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 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。