一,简介
在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; }
三,应用场景
对于读多写少的场景(例如:缓存),可以有效减少锁冲突,提示系统并发能力。