线程安全的List都有什么?

2021-03-03  本文已影响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方法。

上一篇下一篇

猜你喜欢

热点阅读