`

Copy-On-Write并发容器

    博客分类:
  • java
阅读更多

一,简介

       在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;
    }

 三,应用场景

     对于读多写少的场景(例如:缓存),可以有效减少锁冲突,提示系统并发能力。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics