MST

星途 面试题库

面试题:Java中线程安全的集合类之CopyOnWriteArrayList原理及应用场景

请简要阐述Java中CopyOnWriteArrayList的工作原理,并举例说明在哪些场景下适合使用它。
26.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

工作原理

  1. 写时复制:当对CopyOnWriteArrayList执行添加、修改或删除操作时,它会先创建一个底层数组的副本,在副本上执行相应操作,操作完成后将原数组引用指向新的副本。例如,调用add方法时:
public boolean add(E e) {
    synchronized (lock) {
        Object[] elements = getArray();
        int len = elements.length;
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        newElements[len] = e;
        setArray(newElements);
        return true;
    }
}
  1. 读操作不加锁:读操作(如get方法)直接读取原数组,不会加锁。这是因为写操作是在新的副本上进行,原数组不会被修改,从而保证了读操作的线程安全性和高性能。
public E get(int index) {
    return get(getArray(), index);
}
private E get(Object[] a, int index) {
    return (E) a[index];
}

适用场景

  1. 读多写少场景:比如在日志系统中,大量线程可能会频繁读取日志记录,但写入操作相对较少。使用CopyOnWriteArrayList可以让读操作无锁执行,提高性能。
  2. 数据相对稳定场景:像配置信息存储,配置在系统运行期间很少更改,但会被多个线程频繁读取。此时CopyOnWriteArrayList能在保证线程安全的同时,提供高效的读性能。