CopyOnWrite (写时复制)
前提是本来要变成俩份数据,做一次复制的。但是先不做,放到写操作的时候,再写成俩份。
Linux的CopyOnWrit 最初是linux的线程的fork()与exec()函数。为了少一次复制快速创建子线程。
Redis的CopyOnWrite 在RDB的时候,主线程不去copy而是正常的读写等真正的有额写入操作RDB才去写入被修改的内存。
JAVA的CopyOnWrite 就是 CopyOnWriteArrayList,CopyOnWriteArrayList是ArrayList的线程安全版本,从他的名字可以推测,CopyOnWriteArrayList是在有写操作的时候会copy一份数据,然后写完再设置成新的数据。CopyOnWriteArrayList适用于读多写少的并发场景,CopyOnWriteArraySet是线程安全版本的Set实现,它的内部通过一个CopyOnWriteArrayList来代理读写等操作,使得CopyOnWriteArraySet表现出了和CopyOnWriteArrayList一致的并发行为。CopyOnWriteArrayList使用了ReentrantLock来支持并发操作 set、add方法,array就是实际存放数据的数组对象。ReentrantLock是一种支持重入的独占锁,任意时刻只允许一个线程获得锁,所以可以安全的并发去写数组。底部实现(这里是数组)
get方法不加锁直接返回。
volatile 修饰,保证一致性
写时复制,写完更新引用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76454.html