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



Oracle说

注意Iterator。Remove是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了底层集合,则该行为是未指定的。

这是否意味着即使多个线程在同一集合的上迭代,快速失败实现(Vector, Hashmap, ArrayList, HashSet)对象执行iterator.remove()也不会抛出ConcurrentModificationException ?

No。这告诉你,在迭代过程中(在一个线程中)删除元素的唯一安全方法是使用iterator.remove。如果从其他线程访问(迭代或修改)collection(有时会得到异常,有时不会),一般情况下行为是不确定的,因此应该避免使用它或依赖它。

也就是说,唯一的例外是并发集合。

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

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

相关内容

  • 没有找到相关文章

最新更新