什么是Copy-on-Write
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章给大家介绍什么是Copy-on-Write,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。简介: Copy-on-Write所谓 Copy-on-Write, 很简单,顾名
千家信息网最后更新 2025年01月31日什么是Copy-on-Write所谓 Copy-on-Write, 很简单,顾名思义, 就是" 写数据的时候利用拷贝的副本来执行 "。 Java中中常用的就是CopyOnWriteArrayList和 CopyOnWriteArraySet 这两个 Copy-on-Write 容器,它们背后的设计思想就是 Copy-on-Write; 通过 Copy-on-Write 这两个容器实现的读操作是无锁的,由于无锁,所以将读操作的性能发挥到了极致 可以看到在add的时候首先通过cas获取锁,然后获取原数组长度.
调用copyOf将原数组复制到新数组中且长度为原数组长度+1
然后调用setArray方法,也就是说修改的时候实际调用的是源数组的副本,那我们进一步跟进setArray方法 CopyOnWriteArrayList,就是用空间换时间,更新的时候基于副本更新,避免锁,然后最后用volatile变量来赋值保证可见性,适用于读多写少的场景,所以还是要根据实际业务场景,判断哪种适合。
这篇文章给大家介绍什么是Copy-on-Write,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
简介: Copy-on-Write
源码分析:
我们一起看下CopyOnWriteArrayList源码,首先看下add方法:
public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } }
/** * Sets the array. */ final void setArray(Object[] a) { array = a; }
可以看到在这里直接将新数组复制给array; 那array是谁呢 敲黑板! 划重点来了
private transient volatile Object[] array;
内部静态变量,并且有volatile修饰,那么就可以用volatile写的方式,把这个副本数组赋值给volatile修饰的那个数组的引用变量了。
只要一赋值给那个volatile修饰的变量,立马就会对读线程可见,大家都能看到最新的数组了。
难么在新增的同时有读情求过来呢?会不会阻塞呢?我们接着看get方法:
public E get(int index) {
return get(getArray(), index);
}
final Object[] getArray() {
return array;
}
根本不会堵塞或者不安全呢,因为修改的时候采用的是源数组的副本,十分简单直接根据下标从内部静态变量array中获取
关于什么是Copy-on-Write就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
数组
副本
变量
时候
就是
方法
长度
两个
内容
场景
实际
容器
更多
源码
静态
帮助
更新
不错
中中
顾名思义
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
我的世界没有服务器可以联机吗
数据库text分段
有哪些生产管理数据库
软件开发招聘新手
网络安全法与我们的生活
服务器备份脚本
移动dns服务器地址河北保定
网络安全就业前景待遇
access数据库考试题库
软件开发工作事迹总结
福瑞博德软件开发是否外包
设计网络安全方案设计
网络安全毕业论文选题
完美平台链接服务器
服务器绑定多ip
有哪些ip网络技术
软件开发的五大步骤
数据库人事管理系统java
测试人员为什么要学数据库
爱聊软件开发者
网络安全服务发言
武汉网络安全生态圈
河南网络技术服务概况
计算机系统 硬件 软件开发
昆山专业型网络技术咨询热线
优化数据库cup占用率
软件工程包括软件开发技术和什么
服务器怎么预防cc攻击
互联网科技行业的分类
网络技术电脑ps