Copy On Write机制总结

1.Java-CopyOnWriteArrayList

CopyOnWriteArrayList是Java并发包(java.util.concurrent)中的一个线程安全的ArrayList实现。它采用“写时复制”(Copy-On-Write,简称COW)策略来实现对列表的高性能读取和写操作。CopyOnWriteArrayList适用于读操作远多于写操作的场景,能有效减少锁的竞争,提高并发性能

1.1 为什么需要CopyOnWriteArrayList

在多线程环境下,对ArrayList进行并发读写操作可能会引发线程安全问题。虽然可以使用Vector或者
Collections.synchronizedList()实现线程安全的列表,但这些方法使用了全局锁,导致并发性能降低。为了解决这个问题,CopyOnWriteArrayList使用了COW策略,在每次修改操作时,都会复制一个新的副本,从而避免了并发读写时的锁竞争,提高了并发读取性能。

1.2 CopyOnWriteArrayList与ArrayList、Vector的区别

  • 线程安全性:CopyOnWriteArrayList是线程安全的,而ArrayList不是;Vector也是线程安全的,但它使用全局锁,导致性能较差。
  • 读写性能:CopyOnWriteArrayList具有较高的并发读性能,但写操作性能较差,因为每次写操作都需要复制一个新的副本。ArrayList具有较高的读写性能,但在多线程环境下可能出现线程安全问题。Vector的读写性能较差,因为它使用全局锁。
  • 内存占用:CopyOnWriteArrayList在写操作时需要复制一个新的副本,因此可能导致较高的内存占用。ArrayList和Vector的内存占用相对较低。
  • 实时性:CopyOnWriteArrayList的迭代器只能获取到写操作前的数据副本,因此在迭代过程中无法获取实时数据。ArrayList和Vector的迭代器可以获取实时数据,但在多线程环境下可能会导致线程安全问题。

1.3 CopyOnWriteArrayList的使用场景

  • 高并发读场景:由于CopyOnWriteArrayList采用写时复制策略,读操作可以直接访问原列表,而无需加锁。这使得CopyOnWriteArrayList在高并发读场景下具有较高的性能。当读操作远多于写操作时,CopyOnWriteArrayList是一个很好的选择。
  • 低频修改、高频查询场景:CopyOnWriteArrayList在每次写操作时都会复制一个新的副本,因此写操作的性能较差。但是,如果对列表的修改操作较少,而查询操作频繁,CopyOnWriteArrayList仍然可以提供良好的性能。在这种场景下,可以考虑使用CopyOnWriteArrayList来实现线程安全的列表操作。
  • 实时性要求不高的场景:CopyOnWriteArrayList的迭代器只能访问到写操作前的数据副本,因此在迭代过程中无法获取实时数据。如果应用场景对实时性要求不高,可以考虑使用CopyOnWriteArrayList。

1.4 缺点

  • 写操作性能较低
  • 内存占用较高
  • 迭代器实时性差

2.Redis中RDB对COW的应用

1、 Redis是单线程的,那在RDB的过程中,是不是就没法对外提供服务了?
Redis操作快的一个重要原因是Redis的数据是在内存中存储和操作的,持久化本身是磁盘的IO操作,IO操作又是特别耗时的,RDB备份的过程对Redis来说是挺漫长的,如果Redis没法对外提供服务的话,对Redis的影响是很大的吧;
2、知道备份时不会阻塞对外服务,那在数据备份的过程中,有新的数据变更的操作发生时,备份的是变更前的数据还是变更后的数据呢?
另一个角度:RDB快照的是精确的一个时刻的内存数据呢?还是一段时间内的内存数据?
另一个角度:RDB快照是精确的还是模糊的?
3、既然是数据备份,在开始备份的时候,是不是要把Redis的所有数据现在内存中拷贝一份呢?那样的话平时Redis服务器的内存利用率就不能大于50%了啊?

  • Redis中执行BGSAVE命令生成RDB文件时,本质就是调用Linux中的fork()命令,Linux下的fork()系统调用实现了copy-on-write写时复制;
  • fork()是类Unix操作系统上创建线程的主要方法,fork用于创建子进程(等同于当前进程的副本);
  • 传统的普通进程复制,会直接将父进程的数据拷贝到子进程中,拷贝完成后,父进程和子进程之间的数据段堆栈是相互独立的;
  • copy-on-write技术,在fork出子进程后,与父进程共享内存空间,两者只是虚拟空间不同,但是其对应的物理空间是同一个;

3.Linux中

4.文件系统中

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值