文章目录
  1. 1. CopyOnWriteArraySet实现原理
    1. 1.1. 特点
    2. 1.2. 数据结构
    3. 1.3. 源码实现
    4. 1.4. 相关

CopyOnWriteArraySet实现原理

特点

  1. COW机制实现
  2. 无序的
  3. 线程安全
  4. 唯一性
  5. 读写分离

数据结构

CopyOnWriteArraySet继承于AbstractSet,由于它是线程安全的,我们一般认为它是HashSet的线程安全实现,但是它和HashSet有本质的区别,HashSet是通过散列表实现的,而CopyOnWriteArraySet是通过动态数组实现,内部元素由CopyOnWriteArrayList负责维护,CopyOnWriteArraySet的元素的唯一性,是通过CopyOnWriteArrayList的addIfAbsent和addAllAbsent实现的。它和CopyOnWriteArrayList一样,使用用于读大于写的场景中。

1
2
3
4
5
public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements java.io.Serializable {
//使用CopyOnWriteArrayList来保存元素
private final CopyOnWriteArrayList<E> al;
...
}

源码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//获取size
public int size() {
return al.size();
}
//是否包含某元素
public boolean contains(Object o) {
return al.contains(o);
}
//转化为数组
public Object[] toArray() {
return al.toArray();
}

//清除数据
public void clear() {
al.clear();
}

//删除元素
public boolean remove(Object o) {
return al.remove(o);
}

//添加元素,使用的CopyOnWriteArrayList的addIfAbsent方法
public boolean add(E e) {
return al.addIfAbsent(e);
}
//添加集合元素,使用的CopyOnWriteArrayList的addAllAbsent方法
public boolean addAll(Collection<? extends E> c) {
return al.addAllAbsent(c) > 0;
}

##相关

//删除多个元素
public boolean removeAll(Collection<?> c) {
return al.removeAll(c);
}

//使用的CopyOnWriteArrayList的迭代器
public Iterator<E> iterator() {
return al.iterator();
}

相关

CopyOnWriteArraySet都是使用CopyOnWriteArrayList来实现的,所以很有必要对CopyOnWriteArrayList实现加强了解,请阅读CopyOnWriteArrayList实现原理

文章目录
  1. 1. CopyOnWriteArraySet实现原理
    1. 1.1. 特点
    2. 1.2. 数据结构
    3. 1.3. 源码实现
    4. 1.4. 相关