用EnumMap替换ConcurrentHashMap

Che*_*eng 5 java

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

  1. 能够迭代地图而不抛出ConcurrentModificationException,而另一个线程正在修改地图内容.
  2. 允许两个线程同时进行两次修改.

有时,我enum用作密钥,从EnumMap Javadoc,我意识到,

集合视图返回的迭代器非常一致:它们永远不会抛出ConcurrentModificationException,它们可能会也可能不会显示迭代进行过程中对映射所做的任何修改的影响.

因此,我可以安全地更换

Map<Country, String> map =  new ConcurrentHashMap<Country, String>();
Run Code Online (Sandbox Code Playgroud)

Map<Country, String> map =  Collections.synchronizedMap(new EnumMap<Country, String>(Country.class));
Run Code Online (Sandbox Code Playgroud)

我知道有没有putIfAbsentEnumMap,但这不要紧,我在这一刻,因为我并不需要它.

axt*_*avt 7

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

  1. 缺乏同步可能会导致内存可见性影响(因为迭代器Collections.synchronizedMap未同步).
  2. 合同Iterator将被打破 - 你可以在退回后NoSuchElementException打电话.next()hasNext()true