1 Star 0 Fork 0

曹昊/toBeTopJavaer

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
basics
java-basic
data-structure
Arrays-asList.md
Class.md
Collection-vs-Collections.md
ConcurrentSkipListMap.md
CopyOnWriteArrayList.md
Enumeration-vs-Iterator.md
HashMap-HashTable-ConcurrentHashMap.md
annotation-in-spring.md
aop-vs-proxy.md
api-vs-spi.md
arraylist-vs-linkedlist-vs-vector.md
basic-data-types.md
bio-vs-nio-vs-aio.md
block-vs-non-blocking.md
boxing-unboxing.md
byte-stream-vs-character-stream.md
characteristics.md
constructor.md
create-annotation.md
create-spi.md
custom-annotation.md
deadlock-java-level.md
dynamic-proxy-implementation.md
dynamic-proxy-vs-reflection.md
dynamic-proxy.md
enum-compare.md
enum-impl.md
enum-serializable.md
enum-singleton.md
enum-switch.md
enum-thread-safe.md
enum-usage.md
fail-fast-vs-fail-safe.md
final-string.md
float-amount.md
float.md
genericity-list-wildcard.md
genericity-list.md
inheritance-composition.md
input-stream-vs-output-stream.md
integer-cache.md
integer-scope.md
java-pass-by.md
jvm-language.md
k-t-v-e.md
linux-io.md
meta-annotation.md
object-oriented-vs-procedure-oriented.md
overloading-vs-overriding.md
platform-independent.md
polymorphism.md
principle.md
reflection.md
scope.md
serialize-principle.md
serialize-singleton.md
serialize.md
set-repetition.md
set-vs-list.md
simpledateformat-thread-safe.md
single-double-float.md
spi-principle.md
stack-alloc.md
static-proxy.md
stream.md
string-append.md
string-concat.md
substring.md
switch-string.md
synchronized-vs-asynchronization.md
synchronized.md
synchronizedlist-vector.md
syntactic-sugar.md
usage-of-reflection.md
value-of-vs-to-string.md
variable.md
jvm
catalog
mind-map
pics
.gitattributes
.gitignore
README.md
mind-map.md
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
CopyOnWriteArrayList.md 1.73 KB
一键复制 编辑 原始数据 按行查看 历史

Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。

CopyOnWriteArrayList相当于线程安全的ArrayList,CopyOnWriteArrayList使用了一种叫写时复制的方法,当有新元素add到CopyOnWriteArrayList时,先从原有的数组中拷贝一份出来,然后在新的数组做写操作,写完之后,再将原来的数组引用指向到新数组。

这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

注意:CopyOnWriteArrayList的整个add操作都是在锁的保护下进行的。也就是说add方法是线程安全的。

CopyOnWrite并发容器用于读多写少的并发场景。比如白名单,黑名单,商品类目的访问和更新场景。

和ArrayList不同的是,它具有以下特性:

支持高效率并发且是线程安全的 因为通常需要复制整个基础数组,所以可变操作(add()、set() 和 remove() 等等)的开销很大 迭代器支持hasNext(), next()等不可变操作,但不支持可变 remove()等操作 使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照

Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/CHll/toBeTopJavaer.git
git@gitee.com:CHll/toBeTopJavaer.git
CHll
toBeTopJavaer
toBeTopJavaer
master

搜索帮助