MST

星途 面试题库

面试题:Java中如何使ArrayList具备线程安全?

在Java的多线程环境下,ArrayList本身不是线程安全的。请描述至少两种方法让ArrayList在多线程场景中安全使用,并简要说明每种方法的原理及适用场景。
47.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 使用Collections.synchronizedList方法
    • 原理Collections.synchronizedList方法返回一个同步的List包装器,对List的所有操作(如添加、删除、获取元素等)都通过synchronized关键字进行同步,确保在同一时间只有一个线程能够访问该List,从而保证线程安全。
    • 适用场景:适用于对线程安全要求较高,且对性能要求不是极致苛刻的场景。这种方式简单易用,不需要对原有代码进行大幅度修改。示例代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SynchronizedListExample {
    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<>();
        List<String> synchronizedList = Collections.synchronizedList(arrayList);
        // 多线程操作synchronizedList
    }
}
  1. 使用CopyOnWriteArrayList
    • 原理CopyOnWriteArrayList在进行写操作(如添加、删除元素)时,会先复制一份原数组,在新的数组上进行操作,操作完成后再将原数组引用指向新数组。读操作(如获取元素)则直接读取原数组,由于读操作不会修改数组,所以不需要加锁,读写分离,提高了并发性能。
    • 适用场景:适用于读多写少的场景,因为写操作需要复制数组,开销较大。示例代码如下:
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {
    public static void main(String[] args) {
        List<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>();
        // 多线程操作copyOnWriteArrayList
    }
}