CopyOnWriteArraySet源码解析

CopyOnWriteArraySet为线程安全的Set实现,本文记录CopyOnWriteArraySet源码解析,基于JDK1.8。

类结构

先来看下CopyOnWriteArraySet的类层级关系图:

QQ20210224-101418@2x

没什么好说的。再来看看内部属性:

1
2
// 就一个属性,CopyOnWriteArraySet内部采用CopyOnWriteArrayList存储元素
private final CopyOnWriteArrayList<E> al;

和HashSet不一样的是,CopyOnWriteArraySet内部采用CopyOnWriteArrayList存储元素,这也是CopyOnWriteArraySet名字的由来,因为CopyOnWriteArrayList是线程安全的,CopyOnWriteArraySet的方法都是基于CopyOnWriteArrayList实现的,所以CopyOnWriteArraySet自然而然也是线程安全的,同样的,在并发环境下获取数据是弱一致性的!

方法解析

构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 空参构造函数,实际就是初始化CopyOnWriteArrayList
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}

// 传入集合对象
public CopyOnWriteArraySet(Collection<? extends E> c) {
// 分两种情况
if (c.getClass() == CopyOnWriteArraySet.class) {
// 如果集合就是CopyOnWriteArraySet类型,说明数据是不重复的
// 直接全部添加到CopyOnWriteArrayList中
@SuppressWarnings("unchecked") CopyOnWriteArraySet<E> cc =
(CopyOnWriteArraySet<E>)c;
al = new CopyOnWriteArrayList<E>(cc.al);
}
else {
// 否则调用addAllAbsent添加所有当前集合中不存在的元素,确保数据的唯一性
al = new CopyOnWriteArrayList<E>();
al.addAllAbsent(c);
}
}

add(E e)

add(E e)添加指定元素:

1
2
3
4
5
public boolean add(E e) {
// 实际调用CopyOnWriteArrayList的addIfAbsent方法
// 元素不存在,则添加,返回true;元素存在,则不添加,返回false
return al.addIfAbsent(e);
}

可以看到,CopyOnWriteArraySet的add方法通过调用CopyOnWriteArrayList的addIfAbsent来确保元素不重复,以满足Set的特性。

剩下方法略

剩下方法都比较简单,都是直接调用CopyOnWriteArrayList方法实现,感兴趣自己阅读源码。

请作者喝瓶肥宅水🥤

0