NightPxy 个人技术博客

java-CopyOnWriteArrayList

Posted on By NightPxy

概述

CopyOnWriteArrayList 是一种不可变集合
前问已经讨论过,不可变是一种绝对线程安全,所以CopyOnWriteArrayList是一种线程安全集合

不可变原理

不可变集合的原理是副本复制. 通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器

当然,因为技术上的原因,不可变集合不等于无锁集合
最大的问题在与在技术上无法做到深拷贝线程安全,所以在复制过程中,不可变集合是需要加锁使用的

不可变集合优劣

不可变集合的优势是整个读场景是完全无锁的.(包括正在写)

不可变集合的劣势有两点

  • 不可变集合一致性是最终一致性而不是强一致性
    也就是不可变集合的变更对读而言不是即时生效的,会有一个取回过程
  • 写场景的高内存占用
    每一次写都是一次深拷贝复制,特别是不可变集合一般都相对较大.会导致高内存占用(必须考虑因为带来的年轻代GC或者FullGC)

不可变特别适合只读场景(或者极其微量的变更)
不可变的场景经常用缓存举例.但这个缓存是具体分析的,比如不可变可以使用在配置缓存中,因为配置缓存只有理论上的变更可能.但不适用于应用缓存
总之,不可变集合是一个高效的并发集合,但一定不要低估变更带来的风险