如果只有一个编写器线程,我们是否需要同步java HashMap获取

时间:2016-11-16 13:55:09

标签: java hashmap synchronization

我正在维护一个内存HashMap,用于将testUserIds的列表存储到他们的emailId

HashMap<Integer, String> testUsers = new HashMap<>()

只有一个后台线程读取testUsers列表的添加/删除并在此映射上执行操作。由于只有一个线程写入此映射,因此我不必将其作为同步映射。

但是有多个线程从这张地图中读取。如果只有一个作家但有多个读者,我需要ConcurrentHashMap吗?

2 个答案:

答案 0 :(得分:6)

是的,您应该使用ConcurrentHashMap(或在外部同步您的Map)。否则,如果编写器线程正在修改Map而任何其他线程在Map上进行迭代,则可以获得ConcurrentModificationException

来自HashMap&#39; Javadoc

  

请注意,此实现未同步。 如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了地图必须在外部进行同步

来自ConcurrentModificationException&#39; Javadoc:

  

<强> java.util.ConcurrentModificationException

     

当不允许进行此类修改时,检测到对象的并发修改的方法可能抛出此异常。

     

例如,一个线程通常不允许修改Collection而另一个线程正在迭代它。通常,在这些情况下,迭代的结果是不确定的。如果检测到此行为,某些Iterator实现(包括JRE提供的所有通用集合实现的实现)可能会选择抛出此异常。执行此操作的迭代器称为失败快速迭代器,因为它们快速而干净地失败,而不是在未来的未确定时间冒着任意的,非确定性行为的风险。

答案 1 :(得分:0)

是的,如果您在多线程环境中工作,则必须考虑同步,否则将传递意外数据。