📅  最后修改于: 2023-12-03 15:31:51.707000             🧑  作者: Mango
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
时需要注意,由于底层使用了写时复制技术,因此遍历列表时需要使用迭代器。