List<String> list = new ArrayList<>(List.of("1", "2"));
Iterator<String> iter = list.iterator();
iter.next();
list.add(0, "first!"); // adding to the list while iterating over it
iter.remove(); // we're using Iterator.remove here, still CME!
也,
List<String> list = new ArrayList<>(List.of("1", "2"));
// make two iterators of the same list
Iterator<String> iter1 = list.iterator();
Iterator<String> iter2 = list.iterator();
iter1.next(); // advance one of them
iter1.remove(); // we're using Iterator.remove here
iter2.next(); // iter2 doesn't know about iter1 has removed an element, so CME
1条答案
按热度按时间wgmfuz8q1#
如果我使用迭代器
remove()
对于单线程和多线程环境,我将不会得到任何ConcurrentModificationException
或者其他一些例外?一般来说,对于单线程和多线程环境,您将获得
ConcurrentModificationException
SCME可能由许多因素引起,而不仅仅是“不使用”
Iterator.remove
当使用迭代器在列表上迭代时”。例如,下面是一些生成cme的代码:也,
问题中出现了类似的情况:为什么这个java代码会触发concurrentmodificationexception?我已经回答了。
但在您的代码中,我没有看到这种情况发生,所以我认为在单个线程中应该可以。
但是,如果列表可由多个线程访问,则会出现问题。
Iterator.remove
不应该为您解决所有的多线程同步问题。另一个线程可以在您迭代列表时对列表进行任何结构更改,如果您没有进行适当的同步,也就是说。解决这个问题的一种方法(根据您的用例,肯定有更好的方法)是在对列表进行任何结构更改之前以及在迭代之前获取锁。标准库提供了一系列线程安全的集合。如果需要,请选择合适的。