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

JUC 一 CopyOnWriteArrayList 和 CopyOnWriteArraySet

时间:2019-08-26 00:09:04      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:uil   线程   lis   有一个   element   moni   并发   安全   数组   

java.util.concurrent;

CopyOnWriteArrayList是一个线程安全的ArrayList,通过内部的volatile数组显式锁ReentrantLock来实现线程安全。
CopyOnWriteArraySet是线程安全的Set,它是由CopyOnWriteArrayList实现,内部持有一个CopyOnWriteArrayList引用,所有的操作都是由 CopyOnWriteArrayList来实现的,区别就是CopyOnWriteArraySet是无序的,并且不允许存放重复值。

适用场景

  1. 适合元素比较少,并且读取操作高于更新(add/set/remove)操作的场景
  2. 由于每次更新需要复制内部数组,所以更新操作开销比较大
  3. 内部的迭代器 iterator 使用了“快照”技术,存储了内部数组快照, 所以它的 iterator 不支持remove、set、add操作,但是通过迭代器进行并发读取时效率很高。

源码

    /**
     * The lock protecting all mutators.  (We have a mild preference
     * for builtin monitors over ReentrantLock when either will do.)
     */
    final transient Object lock = new Object();

    /** The array, accessed only via getArray/setArray. */
    private transient volatile Object[] array;

    /**
     * Appends the specified element to the end of this list.
     */
    public boolean add(E e) {
        synchronized (lock) {
            Object[] es = getArray();
            int len = es.length;
            es = Arrays.copyOf(es, len + 1);
            es[len] = e;
            setArray(es);
            return true;
        }
    }

JUC 一 CopyOnWriteArrayList 和 CopyOnWriteArraySet

标签:uil   线程   lis   有一个   element   moni   并发   安全   数组   

原文地址:https://www.cnblogs.com/loveer/p/11409897.html

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