多个线程在单个集合上使用iterator.remove()返回失败快速迭代器

时间:2016-07-05 10:43:55

标签: java multithreading iterator concurrentmodification fail-fast

Oracle says

  

请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定。

这是否意味着即使多个线程在同一个集合的快速实施中(<{1}}重复一起VectorHashmapArrayList)对象执行 iterator.remove()不会抛出HashSet

2 个答案:

答案 0 :(得分:2)

没有。这告诉你,在迭代(在一个线程中)中删除元素的唯一安全方法是使用iterator.remove。如果从其他线程访问(迭代或修改)集合 - 有时你会得到异常,有时候不会 - 通常行为不是确定性的,所以你应该避免使用它或依赖它。

话虽如此 - 唯一的例外是Concurrent集合。

答案 1 :(得分:0)

这并不意味着多线程可以使用iterator.remove()删除数据。

如果要实现它,则需要使用同步类型的集合。即使在这种情况下,您也不应该尝试在两个线程中使用相同的迭代器。如果你有两个线程需要删除条目,那么它们每个都应该有自己的迭代器。