“fail-fast”和“fail-safe”之间有什么区别?
“fail-fast”和”fail-safe”都是迭代器的两种行为方式,但它们在面对集合在迭代过程中被修改的情况时,处理方式不同。
- Fail-Fast:如果在迭代过程中,集合结构被修改(如添加、删除或修改元素),那么迭代器会立即抛出
ConcurrentModificationException
。这种行为被称为fail-fast。这是因为它会立即因并发修改而失败。Java的大部分集合类(如ArrayList
、LinkedList
、HashSet
等)都提供了fail-fast的迭代器。 -
Fail-Safe:如果在迭代过程中,集合结构被修改,那么迭代器不会抛出
ConcurrentModificationException
,而是安全地处理这种修改。这种行为被称为fail-safe。这是因为它可以安全地处理并发修改,而不会失败。fail-safe迭代器通常在开始迭代时创建集合的一个副本,然后在副本上进行迭代,这样即使原集合在迭代过程中被修改,也不会影响到迭代器的操作。Java并发包(java.util.concurrent
)中的CopyOnWriteArrayList
和CopyOnWriteArraySet
提供了fail-safe的迭代器。
总的来说,区别在于:fail-fast的迭代器在检测到集合在迭代过程中被并发修改时,会立即抛出异常;而fail-safe的迭代器则会安全地处理这种情况,通常是通过在开始迭代时创建集合的一个副本来实现。