请解释fail-fast
Fail-fast是Java集合中的一个重要概念。如果在使用迭代器遍历一个集合的过程中,该集合的结构被并发修改(例如添加、删除或修改元素),那么迭代器会立即抛出ConcurrentModificationException
。这种行为就被称为fail-fast。
Fail-fast机制主要是为了防止在并发修改时出现不可预知的结果。例如,如果在迭代过程中删除了一个元素,那么迭代器可能会跳过一些元素或者访问到已经被删除的元素。通过抛出ConcurrentModificationException
,fail-fast机制让我们可以立即知道发生了并发修改,而不是在后续的计算中产生错误。
Java中的大部分集合类,如ArrayList
、LinkedList
、HashSet
、HashMap
等,都提供了fail-fast的迭代器。
例如:
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
Iterator<String> iterator = list.iterator();
// 这个线程在迭代器开始迭代后添加 "three"。
new Thread(() -> {
list.add("three");
}).start();
// 这个线程在遍历列表时会抛出 ConcurrentModificationException。
new Thread(() -> {
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}).start();
在这个例子中,尽管一个线程在迭代过程中修改了列表,迭代器会立即失败并抛出ConcurrentModificationException
。
需要注意的是,尽管fail-fast机制可以帮助我们发现并发修改,但它并不能防止并发修改。如果你需要在多线程环境中使用集合,你应该使用线程安全的集合类,或者自己进行同步处理。