Oracle说
注意Iterator。Remove是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了底层集合,则该行为是未指定的。
这是否意味着即使多个线程在同一集合的上迭代,快速失败实现(Vector
, Hashmap
, ArrayList
, HashSet
)对象执行iterator.remove()也不会抛出ConcurrentModificationException
?
No。这告诉你,在迭代过程中(在一个线程中)删除元素的唯一安全方法是使用iterator.remove。如果从其他线程访问(迭代或修改)collection(有时会得到异常,有时不会),一般情况下行为是不确定的,因此应该避免使用它或依赖它。
也就是说,唯一的例外是并发集合。这并不意味着多线程可以使用iterator.remove()删除数据。
如果你想实现它,你需要使用同步类型的集合。即使在这种情况下,也不应该尝试在两个线程中使用相同的迭代器。如果有两个线程需要删除条目,那么它们都应该有自己的迭代器。