CopyOnWriteList笔记
发布日期:2021-06-28 21:40:36
浏览次数:2
分类:技术文章
本文共 584 字,大约阅读时间需要 1 分钟。
CopyOnWriteList笔记
概述
CopyOnWriteList
是一个写时复制的策略保证 list 的一致性,所以在其增删改的操作中都使用了独占锁 ReentrantLock
来保证某个时间只有一个线程能对 list 数组进行修改。其底层是对数组的修改,调用 Arrays.copyarray()
方法进行对数组的复制,在底层还是调用的 C++ 去进行的数组的复制 System.copyarray()
修改
在修改时如果需要修改的元素和之前元素值相同,会调用 setAarray(elements)
方法将之前的数组又塞回去,看似很多余,其实之中暗藏玄机。 array
字段是被 volutile
修饰,所以调用 setArray()
方法会是缓存行内的 array
字段缓存失败,并防止指令重拍,即 happens-before
原理
弱一致性的迭代器
当调用迭代器 iterator()
方法时,实际上会返回一个 COWIterator
对象,COWIterator
对象会拿到当前的 array
保存在 snapshot
变量中,cursor
是遍历的游标。
虽然 snapshot
是指针引用,但是,叫快照不符合语义,但是在对 list 进行增删改操作时,其实是操作的是复制出来的新数组,所以 snapshot
不会改变,所以其迭代器是弱一致性的。
转载地址:https://blog.csdn.net/ycxzuoxin/article/details/89284618 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月12日 07时50分42秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LeetCode 476. 数字的补数
2019-04-29
LeetCode 342. 4的幂
2019-04-29
El表达式
2019-04-29
springboot banner打印,控制台springboot图案怎么来的
2019-04-29
linux shell內建命令区分--type
2019-04-29
java--打印当前项目加载的jar包--getResources
2019-04-29
mybatis 学习记录(3)—— 动态 sql
2019-04-29
面试官:说说快速失败和安全失败是什么
2019-04-29
Java的final和static区别
2019-04-29
建立索引的好处
2019-04-29
java如何对ArrayList中对象按照该对象某属性排序
2019-04-29
今天碰到IE的一个问题, 两个IFRAME的问题
2019-04-29
js实现列表滚动
2019-04-29
WindowXP下PHP5开发环境配置 (转载)
2019-04-29
用java调用webservice接口
2019-04-29
jquery 横向柱形图
2019-04-29
log4j.xml输出日志调试过程
2019-04-29
<param name="wmode" value="transparent">
2019-04-29
myeclipse集成ant
2019-04-29