关于copyonwriteArraySet的一点疑问

辉酱OvO 辉酱OvO 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近在学习juc,看到实现set安全时有这样的类,copyonwriteArraySet,底层是使用了copyonwriteArraylist,但是研究源码发现稍有区别,也有些疑惑。(查看源码的版本是:OPENJDK8)

首先描述一下该类的方法:当我们往set中add时

调用该类时使用的是这个方法,点进去


这里我理解是首先获得当前的快照,然后判断新元素是否在快照的数组中。如果存在则返回false,不存在则返回加入


这个是加入方法,与copyonwriteArrayList的add方法类似,中间多了个if判断,我的理解是:因为之前判断的时候是没有加锁的,所以可能出现数据不一致的情况,因此重新获取一遍数据。


我的疑问在第二个图的indexOf方法中。因为到这里为止,线程都是没有锁的。假如我在判断indexOf是否存在的过程中,其他线程修改了这个数组,那么会不会出现越界情况呢?(因为添入如删除都是使用的复制方法,那么数组长度肯定会改变,那么我for循环遍历的时候岂不是有问题呢?)
附上IndexOf的方法内部



...全文

相关推荐

评论 10
收藏 已收藏
分享
返回顶部
辉酱OvO
Java 51,407 成员 86,126 内容