我正在维护一个内存HashMap
,用于将testUserIds
的列表存储到他们的emailId
。
HashMap<Integer, String> testUsers = new HashMap<>()
只有一个后台线程读取testUsers
列表的添加/删除并在此映射上执行操作。由于只有一个线程写入此映射,因此我不必将其作为同步映射。
但是有多个线程从这张地图中读取。如果只有一个作家但有多个读者,我需要ConcurrentHashMap
吗?
答案 0 :(得分:6)
是的,您应该使用ConcurrentHashMap
(或在外部同步您的Map
)。否则,如果编写器线程正在修改Map
而任何其他线程在Map
上进行迭代,则可以获得ConcurrentModificationException
。
来自HashMap
&#39; Javadoc
:
请注意,此实现未同步。 如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了地图,必须在外部进行同步。
来自ConcurrentModificationException
&#39; Javadoc:
<强> java.util.ConcurrentModificationException 强>
当不允许进行此类修改时,检测到对象的并发修改的方法可能抛出此异常。
例如,一个线程通常不允许修改Collection而另一个线程正在迭代它。通常,在这些情况下,迭代的结果是不确定的。如果检测到此行为,某些Iterator实现(包括JRE提供的所有通用集合实现的实现)可能会选择抛出此异常。执行此操作的迭代器称为失败快速迭代器,因为它们快速而干净地失败,而不是在未来的未确定时间冒着任意的,非确定性行为的风险。
答案 1 :(得分:0)
是的,如果您在多线程环境中工作,则必须考虑同步,否则将传递意外数据。