Java源码-COW
解决了什么问题
A thread-safe variant of ArrayList in which all mutative operations (add, set, and so on)
引用CopyOnWriteArrayList的doc就是解决了ArrayList并发场景下对容器的修改安全性问题
1 解决方案
涉及修改数组数据或者结构的操作引用副本
2 优点
- 实现简单 空间换时间
- 读多写少场景下几乎不存在因为锁导致的性能瓶颈(极端情况下只读不写则跟ArrayList是一样的)
3 弊端
- 空间开销
- 数据延迟带来的不一致
4 源码
java
1 |
|
实现跟ArrayList几乎一样,只关注List的几个常用api就行。
4.1 CopyOnWriteArrayList#get(int)
没有对入参的脚标显式代码校验,交给jdk底层数组索引IndexOutOfBoundsException
java
1 |
|
4.2 CopyOnWriteArrayList#set(int, E)
java
1 |
|
4.3 CopyOnWriteArrayList#add(E)
java
1 |
|
4.4 CopyOnWriteArrayList#add(int,E)
java
1 |
|
4.5 CopyOnWriteArrayList#remove(int)
java
1 |
|
5 总结
- 迭代操作(读)不上锁 不影响性能
- 涉及修改数据或者数据结构的操作(写)(add, set, remove…) => 空间换时间 synchronized{}代码块中的操作就是数据不一致的上限
- 上锁(synchronized)保证线程安全
- 不直接操作数据容器,拷贝一份副本进行操作,结束后改变指针引用
- volatile关键字保证存储数据的数组线程可见性
Java源码-COW
https://bannirui.github.io/2023/03/11/Java源码-COW/