美文网首页
线程安全的List都有什么?

线程安全的List都有什么?

作者: 从零开始的程序猿生活 | 来源:发表于2021-03-03 14:50 被阅读0次

    1、Vector
    这个是最常听到的线程安全的List实现,但是已经不常用了。
    内部实现直接使用synchronized 关键字对 一些操作的方法加锁。性能很慢。
    2、SynchronizedList
    使用Collections.synchronizedList(list); 将list包装成SynchronizedList
    需要注意的是SynchronizedList的add等操作加了锁,但是iterator()方法没有加锁,如果使用迭代器遍历的时候需要在外面手动加锁。
    适用场景:当不需要使用iterator()并且对性能要求不高的场景。

    SynchronizedList 和 Vector区别
    1> SynchronizedList 有较好的扩展性,可以将ArrayList ,LinkedList等都改成同步的,而Vector底层只有数组的结构。
    2> SynchronizedList 并没有对Iterator方法进行加锁,遍历时需要手动同步处理,Vector加锁了。
    3> SynchronizedList 可以指定锁定的对象。
    4> 扩容机制不一样SynchronizedList 1.5倍 ,Vector 2倍。
    5、SynchronizedList使用同步代码块,锁的范围更小。Vector锁的方法。

    3、CopyOnWriteArrayList
    在写的时候加锁(ReentrantLock锁),读的时候不加锁,大大提升了读的速度。
    添加元素的时候,先加锁,再复制替换操作,再释放锁。

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

    适用场景:适用于读多写少的场景。

    CopyOnWriteArraySet 这个集合也是在add时加锁,不过在增加元素前会先判断元素是否存在,不存在才会调add方法。

    相关文章

      网友评论

          本文标题:线程安全的List都有什么?

          本文链接:https://www.haomeiwen.com/subject/usmqqltx.html