专注于分布式,性能优化,代码之美

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;

posted on 2021-04-27 12:59  xiaohouye  阅读(175)  评论(0编辑  收藏  举报

导航

今日之劳累是为了铸造明日之辉煌,不管年龄多少,都无法阻挡我对软件艺术的追求!