对读写锁规则的升级

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
        if (ObjectUtils.isEmpty(response) || !response.getIsSelectionSuccess()) {
latch.countDown(); //这里计数器需要变化
return;
}


listResult.add(response);
latch.countDown(); //这里计数器需要改变
});
}
latch.await();
return listResult;

相关文章:

  • 2021-09-27
  • 2021-09-25
  • 2022-01-13
  • 2021-11-09
  • 2022-12-23
  • 2022-12-23
  • 2021-10-15
猜你喜欢
  • 2021-10-10
  • 2021-08-26
  • 2021-11-01
  • 2021-06-26
  • 2021-08-14
  • 2021-06-30
相关资源
相似解决方案