3 回答
TA贡献1789条经验 获得超8个赞
如果您这样做的原因是跟踪线程完成情况,为什么不使用 CountdownLatch?不确定 HashMap 是否只能在删除时出现并发问题,我建议仅当您的代码不会因任何可能的问题而中断时才使用它,或者使用 ConcurrentHashMap。
TA贡献1828条经验 获得超13个赞
javadoc说HashMap
:
请注意,此实现不是同步的。
如果多个线程同时访问哈希图,并且至少有一个线程在结构上修改了该图,则必须进行外部同步。(结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)这通常是通过在自然封装映射的某个对象上进行同步来完成的。
上面提到,删除是一个结构性的改变,必须使用同步。
再者,在removeNode()
Hashmap的方法中(方法调用的remove()
),modCount
变量是递增的,它负责ConcurrentModificationException
. 因此,如果在没有同步的情况下删除元素,您可能会遇到此异常。
因此您必须使用ConcurrentHashMap
.
TA贡献1873条经验 获得超9个赞
您询问了HashMap
和之间的差异ConcurrentHashMap
,但还需要考虑一个额外的数据结构:Hashtable
。每一个都存在差异和权衡。您需要评估哪一个最适合您的预期用途。
HashMap
是不同步的,因此如果多个线程可以读取或写入它,您的结果将是不可预测的。HashMap
还允许 null 作为键或值。Hashtable
是同步的,不支持空键或值。来自哈希表 Javadoc:哈希表是同步的。如果不需要线程安全的实现,建议使用HashMap代替Hashtable。如果需要线程安全的高并发实现,那么建议使用ConcurrentHashMap代替Hashtable。
ConcurrentHashMap
是线程安全的,不允许使用 null 作为键或值。
添加回答
举报