修改CopyOnWrite部分的表述

This commit is contained in:
xiangflight 2018-07-12 15:15:06 +08:00
parent 08457794f7
commit e7d694d841

View File

@ -255,17 +255,18 @@ List<String> synList = Collections.synchronizedList(list);
List<String> list = new CopyOnWriteArrayList<>();
```
扩展CopyOnWriteArrayList是一种CopyOnWrite容器即写时复制的容器。从以下源码中看出当向容器中添加元素时不是直接往当前容器添加而是Copy当前容器在新容器中添加添加完后将原容器的引用指向新容器。这样做可以对CopyOnWrite容器进行并发的读不需要加锁极大地提高了读性能因此适用于读多写少的场景。
扩展
CopyOnWriteArrayList是一种CopyOnWrite容器从以下源码看出添加元素是在复制的新数组上进行的然后将原数组的引用指向新数组读取元素是从原数组读取。这样可以进行并发的且不需加锁的读取读取效率高适用于读操作远大于写操作的场景中。
```java
public boolean add(E e) {
final ReentrantLock lock = this.lock;
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;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
@ -273,9 +274,13 @@ public boolean add(E e) {
}
}
final void setArray(Object[] a) {
array = a;
}
@SuppressWarnings("unchecked")
private E get(Object[] a, int index) {
return (E) a[index];
return (E) a[index];
}
```