Java 集合面试题, 你遇到过 ConcurrentModificationException 错误吗?它是如何产生的?
Java 集合面试题, 你遇到过 ConcurrentModificationException 错误吗?它是如何产生的?
QA
Step 1
Q:: 你遇到过 ConcurrentModificationException 错误吗?它是如何产生的?
A:: ConcurrentModificationException 是在一个集合被结构性修改时(如添加或删除元素),但该集合正在被迭代时引发的异常。通常,这种异常是通过在迭代期间直接使用集合的 add()、remove() 等方法引起的。在多线程环境中,如果一个线程在迭代集合的同时,另一个线程对集合进行了修改,也会导致该异常。避免这种异常的常见方法是使用 Iterator 的 remove()
方法或者使用并发集合(如 ConcurrentHashMap、CopyOnWriteArrayList 等)。
Step 2
Q:: 如何避免 ConcurrentModificationException?
A:: 可以通过以下几种方式避免 ConcurrentModificationException:1. 在遍历集合时使用 Iterator 的 remove() 方法而不是集合的 remove() 方法。2. 使用 Java 提供的并发集合类,如 ConcurrentHashMap、CopyOnWriteArrayList 等。3.
在多线程环境中使用 synchronized 关键字或其他同步机制来确保线程安全。
Step 3
Q:: 什么是 Fail-Fast 和 Fail-
Safe 迭代器?
A:: Fail-Fast 迭代器在遍历集合时,如果发现集合被结构性修改,会立刻抛出 ConcurrentModificationException,例如 ArrayList 的迭代器。而 Fail-
Safe 迭代器则通过复制集合内容,允许集合在遍历过程中被修改而不会抛出异常,例如 CopyOnWriteArrayList 的迭代器和 ConcurrentHashMap 的迭代器。
Step 4
Q:: 在 Java 中有哪些并发集合?它们各自的优缺点是什么?
A:: Java 中常见的并发集合包括:1. ConcurrentHashMap:允许并发读写,效率高,适用于高并发环境。2. CopyOnWriteArrayList:写操作时会复制整个列表,读操作不加锁,适用于读多写少的场景。3. ConcurrentLinkedQueue:非阻塞队列,适用于高并发环境。4. BlockingQueue:如 LinkedBlockingQueue 和 ArrayBlockingQueue,支持阻塞操作,适用于生产者-
消费者模型。
Step 5
Q:: 解释一下 CopyOnWriteArrayList 的工作原理。
A:: CopyOnWriteArrayList 是一种线程安全的 List 实现,所有的修改操作(如 add、set、remove)都会复制一个新的底层数组,以确保读操作不需要加锁。这样可以保证在遍历列表时不会遇到 ConcurrentModificationException,但其代价是每次写操作都会创建一个新的数组,适用于读多写少的场景。