CopyOnWriteArrayList——写入时复制技术

写入时复制技术就是不同进程访问同一资源的时候,只有在 写操作,才会去复制一份新的数据,否则都是访问同一个资源。

也就是说,在这个资源上是没有锁;简单来说,就是平时查询的时候,都不需要加锁,随便访问。应为没有锁,所以多个线程可以同时访问

只有在写入/删除的时候,才会从原来的数据复制一个副本出来,然后修改这个副本,最后把原数据替换成当前的副本。

改操作的同时,读操作不会被阻塞,而是继续 读取旧的数据。这点要跟读写锁区分一下。

在这里插入图片描述
在add的时候,只有一个线程可以add;将原数组copyof成一个新的数组,然后进行修改,修改完成之后通过setArray将新数组设置回去。(整个操作的过程中读是不会受到影响的)

我们来看看Java中JDK的源码实现,其实也是非常的简单,在add操作的时候,先使用synchronized进行加锁,保证同时只有1个线程进行变更,在变更的时候,先拷贝出来一个副本,先操作这个副本,操作完成后,再把现有的数据替换成这个副本。

优点
对于一些 读多写少的数据,这种做法的确很不错,例如配置、黑名单、物流地址等变化非常少的数据,这是一种 无锁的实现。可以帮我们实现程序更高的并发。

缺点
这种实现只是保证数据的最终一致性,在添加到拷贝数据而还没进行替换的时候,读到的仍然是旧数据。如果对象比较大,频繁地进行替换会消耗内存,从而引发Java的GC问题,这个时候,我们应该考虑其他的容器,例如 ConcurrentHashMap

写时复制的思想,却是计算机优化的一种通用思想,我们可以在非常多的架构设计中看到,非常值得学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值