diff --git a/.gitignore b/.gitignore index e69de29b..e43b0f98 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 55cffe2c..f5e7ee10 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -255,6 +255,35 @@ List synList = Collections.synchronizedList(list); List list = new CopyOnWriteArrayList<>(); ``` +CopyOnWriteArrayList是一种CopyOnWrite容器,从以下源码看出:读取元素是从原数组读取;添加元素是在复制的新数组上。读写分离,因而可以在并发条件下进行不加锁的读取,读取效率高,适用于读操作远大于写操作的场景。 + +```java +public boolean add(E e) { + final ReentrantLock lock = this.lock; + lock.lock(); + try { + Object[] elements = getArray(); + int len = elements.length; + Object[] newElements = Arrays.copyOf(elements, len + 1); + newElements[len] = e; + setArray(newElements); + return true; + } finally { + lock.unlock(); + } +} + +final void setArray(Object[] a) { + array = a; +} + +@SuppressWarnings("unchecked") +private E get(Object[] a, int index) { + return (E) a[index]; +} + +``` + ## LinkedList ### 1. 概览