码迷,mamicode.com
首页 > 其他好文 > 详细

Concurrent 包学习

时间:2015-08-17 15:17:05      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:

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 异常。

 

Concurrent 包学习

标签:

原文地址:http://www.cnblogs.com/keep-curiosity/p/4736599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!