📌  相关文章
📜  Java中的 CopyOnWriteArrayList(1)

📅  最后修改于: 2023-12-03 15:31:51.707000             🧑  作者: Mango

Java中的 CopyOnWriteArrayList

简介

CopyOnWriteArrayList是Java中的一个线程安全的List集合,底层使用了一种特殊的写时复制技术,它的写操作是通过创建一个新的副本来实现的,读操作则直接读取原始数据,因此它非常适合读多写少的场景。由于底层机制的特殊性,它的读操作无需加锁,因此具有很高的并发性能。

用法
创建对象

创建一个CopyOnWriteArrayList对象非常简单,只需要调用默认构造函数即可:

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
常用方法

CopyOnWriteArrayList实现了List接口,因此大部分的List操作都可以直接使用。以下是一些常用的方法:

添加元素

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
list.add(1);
list.addAll(Arrays.asList(2, 3, 4));

读取元素

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(1, 2, 3));
int firstElement = list.get(0);
int secondElement = list.get(1);

检查元素是否存在

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(1, 2, 3));
boolean containsTwo = list.contains(2);

删除元素

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(1, 2, 3));
list.remove(0);
list.removeAll(Arrays.asList(2, 3));

清空列表

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(1, 2, 3));
list.clear();
迭代器

由于CopyOnWriteArrayList底层使用了写时复制技术,所以在遍历列表的时候需要使用迭代器。例如:

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(1, 2, 3));
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
多线程

由于CopyOnWriteArrayList是线程安全的,因此可以在多线程环境下使用。以下是一个示例代码:

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
Runnable writer = () -> {
    for (int i = 0; i < 10; i++) {
        list.add(i);
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

Runnable reader = () -> {
    while (true) {
        System.out.println(list);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

Thread writerThread = new Thread(writer);
Thread readerThread = new Thread(reader);
writerThread.start();
readerThread.start();

在以上示例中,我们创建了一个写线程和一个读线程。写线程每50毫秒向列表中添加一个元素,而读线程则不断地读取列表。由于CopyOnWriteArrayList是线程安全的,因此我们无需担心并发问题。

总结

CopyOnWriteArrayList是Java中的一个线程安全的List集合,它的写操作是通过创建一个新的副本来实现的,因此非常适合读多写少的场景。由于底层机制的特殊性,它的读操作无需加锁,因此具有很高的并发性能。在使用CopyOnWriteArrayList时需要注意,由于底层使用了写时复制技术,因此遍历列表时需要使用迭代器。