线程安全的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方法。

https://www.jianshu.com/p/ba3cdde03022?u_atoken=db088c24-5a1a-4522-b9da-3c99e17e2a10&u_asession=01zF45P98l3kW1DPSzZ77VQkYj3EdH_sAhCzme0rGS5SRwnEYMOG5SAPUAZ0sIBQnXX0KNBwm7Lovlpxjd_P_q4JsKWYrT3W_NKPr8w6oU7K8bMbGZowK8IzYUASk-mH95Ppcarp92QKzyJKyYjREPlmBkFo3NEHBv0PZUm6pbxQU&u_asig=05fwFTgCh7mx9ZZp-iVLTy3MBrH58sCy0SxeGZkoUuVNqLx1-J-q4HeEQsyGCYpfGc4XZHjYSbfMWsvJjZvcv_BtPk3q_QiZR2TkIpMR9ICyi4EmZFBZjDhd4dSBwKQmpC4XVe79f43syTRy7oXMFHLjLNlGCup7NVryhH8svXPKP9JS7q8ZD7Xtz2Ly-b0kmuyAKRFSVJkkdwVUnyHAIJzVZBUTV848ZPwPLNojdPtYosup0rJpVEYBrfJb4UstKQWPRPQyB_SKrj-61LB_f61u3h9VXwMyh6PgyDIVSG1W9gwUI975rvGtShOJzqNLjpMcP86Dpk-9o5WW2hT6bxqmlksa6zwRW3j-2LVRySPguB4rGy8zBbhq2BQpd2LWjXmWspDxyAEEo4kbsryBKb9Q&u_aref=tFcHsKl%2BVQDIiL8kfZzkrdXNbag%3D

你可能感兴趣的:(线程安全的List)