用EnumMap替换ConcurrentHashMap

时间:2011-01-16 04:53:49

标签: java

我一直在使用ConcurrentHashMap,如果我想实现以下目标。

  1. 能够在不抛出ConcurrentModificationException的情况下迭代地图,而另一个线程正在修改地图内容。
  2. 允许两个线程同时进行两次修改。
  3. 有时,我使用enum作为密钥,而EnumMap Javadoc,我意识到,

      

    该集合返回的迭代器   观点是微不足道的:他们会   永远不要扔   ConcurrentModificationException和   它们可能会也可能不会显示效果   对地图的任何修改   在迭代进行时发生   进展。

    因此,我可以安全地替换

    Map<Country, String> map =  new ConcurrentHashMap<Country, String>();
    

    Map<Country, String> map =  Collections.synchronizedMap(new EnumMap<Country, String>(Country.class));
    

    我知道putIfAbsent中没有EnumMap,但此时我可以这样做,因为我不需要它。

1 个答案:

答案 0 :(得分:7)

你不能这样做有两个原因:

  1. 缺少同步可能会导致内存可见性影响(因为Collections.synchronizedMap的迭代器未同步)。
  2. Iterator的合同将被破坏 - 在NoSuchElementException返回next()之后致电hasNext()时,您可能会true