CopyOnWriteArrayList 如何是线程安全的

java

1个回答

写回答

㐅韵味灬

2025-06-26 23:05

+ 关注

Java
Java

CopyOnWriteArrayList 是 Java 集合框架中的一个线程安全的类,它通过在写入操作时创建底层数组的副本来实现线程安全。这意味着在读取操作期间,可以同时进行写入操作,而不会出现并发问题。本文将介绍 CopyOnWriteArrayList 的工作原理,并提供一个案例代码来说明其线程安全性。

CopyOnWriteArrayList 的工作原理

CopyOnWriteArrayList 内部使用一个数组来存储元素,当有写入操作发生时,它会创建一个新的数组,并将原始数组中的元素复制到新数组中。因此,读取操作不会受到写入操作的影响,因为读取操作仍然引用旧的数组。这种复制的方式确保了读取操作的线程安全性。

当写入操作发生时,CopyOnWriteArrayList 使用一种称为"写时复制"的技术。它首先创建一个原始数组的副本,然后在副本上执行写入操作。这样,读取操作可以在不受到写入操作干扰的情况下继续进行。最后,写入操作完成后,CopyOnWriteArrayList 将引用新创建的数组,以便下一次写入操作可以创建一个新的副本。

CopyOnWriteArrayList 的案例代码

下面是一个简单的案例代码,演示了 CopyOnWriteArrayList 的线程安全性。

import Java.util.concurrent.CopyOnWriteArrayList;

public class Example {

public static void mAIn(String[] args) {

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();

// 创建并启动两个线程,一个进行写入操作,另一个进行读取操作

Thread writerThread = new Thread(() -> {

for (int i = 0; i < 5; i++) {</p> list.add(i);

System.out.println("Writer added: " + i);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

Thread readerThread = new Thread(() -> {

while (true) {

System.out.println("Reader: " + list);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

writerThread.start();

readerThread.start();

}

}

在上面的代码中,我们创建了一个 CopyOnWriteArrayList 对象,并使用两个线程进行写入和读取操作。写入操作在每次循环中向列表中添加一个整数,并打印添加的值。读取操作在每次循环中打印列表的内容。通过运行这段代码,我们可以观察到写入操作和读取操作是并发执行的,并且没有出现并发问题。

CopyOnWriteArrayList 是一个线程安全的类,它通过在写入操作时创建底层数组的副本来实现线程安全。这种复制的方式确保了读取操作的线程安全性。通过使用 CopyOnWriteArrayList,我们可以在并发环境中安全地进行读取和写入操作,而不需要使用显式的锁机制。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号