线程安全的List都有什么?

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方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容