JAVA CopyOnWriteArrayList 说明
对读写锁规则的升级
CopyOnWriteArrayList 的思想比读写锁的思想又更进一步。为了将读取的性能发挥到极致,CopyOnWriteArrayList 读取是完全不用加锁的,更厉害的是,写入也不会阻塞读取操作,也就是说你可以在写入的同时进行读取,只有写入和写入之间需要进行同步,也就是不允许多个写入同时发生,但是在写入发生时允许读取同时发生。这样一来,读操作的性能就会大幅度提升。
特点
CopyOnWrite的含义
从 CopyOnWriteArrayList 的名字就能看出它是满足 CopyOnWrite 的 ArrayList,CopyOnWrite 的意思是说,当容器需要被修改的时候,不直接修改当前容器,而是先将当前容器进行 Copy,复制出一个新的容器,然后修改新的容器,完成修改之后,再将原容器的引用指向新的容器。这样就完成了整个修改过程。
这样做的好处是,CopyOnWriteArrayList 利用了“不变性”原理,因为容器每次修改都是创建新副本,所以对于旧容器来说,其实是不可变的,也是线程安全的,无需进一步的同步操作。我们可以对 CopyOnWrite 容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素,也不会有修改。
CopyOnWriteArrayList 的所有修改操作(add,set等)都是通过创建底层数组的新副本来实现的,所以 CopyOnWrite 容器也是一种读写分离的思想体现,读和写使用不同的容器。
如下代码: CopyOnWriteArrayList 用法
创建多线程,循环10个线程池
CopyOnWriteArrayList<StudentInfo> listResult = new CopyOnWriteArrayList<>();
CountDownLatch latch = new CountDownLatch(
Student.size()
);
for (SelectionInfo selectionInfo : Student.size()) {
globalThreadPoolExecutor.submit(() -> {
String response=Function();// system.out.print("do something();");
if (ObjectUtils.isEmpty(response) || !response.getIsSelectionSuccess()) {
latch.countDown(); //这里计数器需要变化
return;
}
listResult.add(response);
latch.countDown(); //这里计数器需要改变
});
}
latch.await();
return listResult;
团队五人,专业从事软件开发,接单工作,专注于Java,.Net,PHP