我一直在使用ConcurrentHashMap
,如果我想实现以下目标。
ConcurrentModificationException
的情况下迭代地图,而另一个线程正在修改地图内容。有时,我使用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
,但此时我可以这样做,因为我不需要它。
答案 0 :(得分:7)
你不能这样做有两个原因:
Collections.synchronizedMap
的迭代器未同步)。Iterator
的合同将被破坏 - 在NoSuchElementException
返回next()
之后致电hasNext()
时,您可能会true
。