CopyOnWriteArrayList 作用 代码举例
时间: 2024-10-16 10:02:14 浏览: 17
CopyOnWriteArrayList 是 Java 中的一种线程安全的 ArrayList 实现,其设计目的是为了提供读操作的高性能,同时允许少量的写操作,但避免了在高并发场景下可能出现的性能瓶颈。它的工作原理是在写操作发生时复制整个列表,然后在新的副本上进行修改,而原有的读取操作仍然可以在旧的列表上继续,直到所有写操作完成后,旧的列表会被丢弃,新的列表成为新的共享状态。
例如,如果你有一个需要经常读取但偶尔写入的集合,`CopyOnWriteArrayList` 就是一个好选择:
```java
import java.util.concurrent.CopyOnWriteArrayList;
public class Main {
public static void main(String[] args) {
// 创建 CopyOnWriteArrayList
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
// 并发读取
Thread readerThread1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
System.out.println(list.get(i)); // 这里是安全的,因为是读操作
}
});
Thread readerThread2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
System.out.println(list.get(i));
}
});
// 同步写入
Thread writerThread = new Thread(() -> {
list.add("New Item"); // 写操作,会触发复制
try {
Thread.sleep(1000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
});
readerThread1.start();
readerThread2.start();
writerThread.start();
// 等待所有线程结束
try {
readerThread1.join();
readerThread2.join();
writerThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("List size after write: " + list.size()); // 输出写入后的大小
}
}
```
在这个例子中,两个读线程可以并行访问 `list`,而写线程则会在写入时触发复制操作。注意,`add` 方法实际上不是阻塞的,它会立即返回,但其他线程将看到新项之前的状态。
阅读全文