Concurrent 包学习

CopyOnWriteArrayList

get方法与ArrayList没有什么变化。但是凡是需要改动Array的方法都使用了ReentrantLock进行加锁,然后每次的修改操作都是产生一个新的list,然后setArray设置回去,包括add,set,remove等操作都是。例如add方法,并没有使用ArrayList的扩容机制,而是每次添加元素都是新建一个Array,然后完全copy过去。因此如果频繁修改list,效率会很低。

    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();
        }
    }

对于迭代器来说,不用担心使用迭代器时修改list会报异常,在生成iterator时候会生成一个副本(snapshot),迭代遍历的是副本。但是迭代器的所有修改操作都是不支持的,会抛出 UnsupportedOperationException 异常。

 

posted @ 2015-08-17 14:54  重要的是积累  阅读(249)  评论(0)    收藏  举报