一,简介
在JDK1.5以上版本中,提供了CopyOnWriteArrayList,CopyOnWriteArraySet两种并发容器。采用读写分离的思想(读操作在元数据中操作,写操作则在副本中操作),降低锁冲突,提高并发性。
二,实现原理
/**
*读操作(没有加锁)
* {@inheritDoc}
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
return (E)(getArray()[index]);
}
/**
* Gets the array. Non-private so as to also be accessible
* from CopyOnWriteArraySet class.
*/
final Object[] getArray() {
return array;//存放元数据的数组
}
/**
*写操作(加锁的目的:防止并发量大时,产生过多的元数据副本,耗内存)
*/
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();
}
}
/**
* Sets the array.
*/
final void setArray(Object[] a) {
array = a;
}
三,应用场景
对于读多写少的场景(例如:缓存),可以有效减少锁冲突,提示系统并发能力。