关于copyonwriteArraySet的一点疑问
最近在学习juc,看到实现set安全时有这样的类,copyonwriteArraySet,底层是使用了copyonwriteArraylist,但是研究源码发现稍有区别,也有些疑惑。(查看源码的版本是:OPENJDK8)
首先描述一下该类的方法:当我们往set中add时

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

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

这个是加入方法,与copyonwriteArrayList的add方法类似,中间多了个if判断,我的理解是:因为之前判断的时候是没有加锁的,所以可能出现数据不一致的情况,因此重新获取一遍数据。
我的疑问在第二个图的indexOf方法中。因为到这里为止,线程都是没有锁的。假如我在判断indexOf是否存在的过程中,其他线程修改了这个数组,那么会不会出现越界情况呢?(因为添入如删除都是使用的复制方法,那么数组长度肯定会改变,那么我for循环遍历的时候岂不是有问题呢?)
附上IndexOf的方法内部

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

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

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

这个是加入方法,与copyonwriteArrayList的add方法类似,中间多了个if判断,我的理解是:因为之前判断的时候是没有加锁的,所以可能出现数据不一致的情况,因此重新获取一遍数据。
我的疑问在第二个图的indexOf方法中。因为到这里为止,线程都是没有锁的。假如我在判断indexOf是否存在的过程中,其他线程修改了这个数组,那么会不会出现越界情况呢?(因为添入如删除都是使用的复制方法,那么数组长度肯定会改变,那么我for循环遍历的时候岂不是有问题呢?)
附上IndexOf的方法内部

...全文
相关推荐
Java concurrency集合之CopyOnWriteArraySet_动力节点Java学院整理
CopyOnWriteArraySet的构造函数包括:- `CopyOnWriteArraySet()`: 创建一个空的CopyOnWriteArraySet。
java集合-CopyOnWriteArraySet的使用
CopyOnWriteArraySet 是Java中的一个线程安全的集合类,它实现了 Set 接口并使用了"写时复制"的机制。下面是关于 CopyOnWriteArraySet 的一些重要信息:线程安
CopyOnWriteArrayListCopyOnWri
《CopyOnWriteArrayList与CopyOnWriteArraySet源码解析》CopyOnWriteArrayList与CopyOnWriteArraySet是Java集合框架中的两种线程安全的数据结构
java中循环遍历删除List和Set集合中元素的方法(推荐)
**使用CopyOnWriteArrayList或CopyOnWriteArraySet** 如果你处理的集合在多线程环境下可能会同时被修改,可以考虑使用`CopyOnWriteArrayList`或`
CopyOnWriteArrayList详解[可运行源码]
CopyOnWriteArraySet内部维护了一个CopyOnWriteArrayList实例,所有的添加或删除操作都通过这个内部的列表来实现。


