CopyOnWriteArrayList, CopyOnWrite 的 ArrayList,按名字理解就是 在写ArrayList时复制,
即每次会使容器发生变化,调用add set remove操作时,都是通过创建一个新的数组来实现的。
CopyOnWriteArrayList 适合读多写少的情况,但是如果频繁的写操作,会导致写入性能降低。
当list需要修改时,不是改变原有list,而是复制一份新的数据来进行操作,
操作完成后将新的的数据覆盖替换原来的数据。保证写操作不会影响读操作。
和读写锁ReentrantReadWriteLock有点类似。
读写锁: 读读共享, 读写互斥,写写互斥
但是CopyOnWriteArrayList有点不一样 : 读读共享,读写共享,只有写写才会互斥,
即提高了读操作的性能,只有写写操作之间才需要同步等待,
因为CopyOnWriteArrayList只有写操作才会加锁,读操作没有任何加锁。
代码如下
Object[] newElements = Arrays.copyOf(elements, len + 1);
复制了一个新的数组来进行操作
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();
}
}
而读操作没有任何锁
public E get(int index) {
return get(getArray(), index);
}
private E get(Object[] a, int index) {
return (E) a[index];
}
网友评论