CopyOnWriteArrayList是什么
- CopyOnWriteArrayList 是 Java 并发包 (java.util.concurrent) 中的一个并发安全的 List 实现类。它具有特定的设计,使得在并发场景下,读操作(如迭代)可以并发进行,而写操作(如添加、修改、删除)会进行一定的同步,但不会阻塞读操作
主要特点和用法:
- 线程安全性:
- CopyOnWriteArrayList 是线程安全的。它通过使用复制机制来实现高效的并发访问,即在修改(写操作)时,会创建一个新的复制(copy)版本的数组,写操作在复制版本上进行,而读操作则继续在原数组上进行
- 读写分离:
- 在 CopyOnWriteArrayList 中,读操作不需要加锁,因为每个线程看到的是一个固定的数组版本。这使得读操作可以并发进行,而不会被写操作所阻塞
- 适用场景:
- CopyOnWriteArrayList 特别适合于读操作远远多于写操作的场景,如事件监听器列表、缓存等。因为写操作会涉及数组的复制和替换,因此写操作相对较慢
- 迭代器支持:
- CopyOnWriteArrayList 提供了安全的迭代器,支持在迭代过程中对集合进行并发修改检查
- 内存使用:
- 由于每次写操作都会复制整个数组,因此 CopyOnWriteArrayList 在内存使用上比较大。适合存储元素数目不大、且读操作频繁、写操作较少的情况
CopyOnWriteArrayList的使用
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListExample {
public static void main(String[] args) {
// 创建一个 CopyOnWriteArrayList
List<String> list = new CopyOnWriteArrayList<>();
// 添加元素
list.add("Apple");
list.add("Banana");
list.add("Orange");
// 使用迭代器遍历元素
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println("Fruit: " + fruit);
// 在迭代过程中添加元素
//在'Banana'后面加入'Mango'
if (fruit.equals("Banana")) {
list.add("Mango");
}
}
// 输出列表大小
System.out.println("List size: " + list.size());
}
}
- CopyOnWriteArrayList 是一个适合特定并发需求的 List 实现类,通过牺牲一些写操作的性能来实现读写分离,从而确保在并发访问时的线程安全性。在 Android 开发中,如果需要在多线程环境中安全地访问和修改列表,可以考虑使用 CopyOnWriteArrayList