美文网首页查漏补缺
Vector和SynchronizedList

Vector和SynchronizedList

作者: Batistuta9 | 来源:发表于2021-01-17 17:35 被阅读0次

    ArrayList是非线程安全的集合类,如果在多线程的场景下使用ArrayList,比如一个线程遍历ArrayList的时候,另一个线程修改ArrayList时,会报ConcurrentModificationException(并发修改异常)异常。解决方案一般有两种,使用Vector或者SynchronizedList。

    Vector

    Vector是矢量队列,和ArrayList一样,继承了AbstractList类,实现了List、RandomAccess(实现快速随机访问)、Cloneable、Serializable等接口。

    public class Vector<E>
        extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    

    Vector是通过数组来保存数据的。Vector有4种构造函数。

    // 第一种,默认大小为10
    Vector()
    // 第二种,指定向量的size
    Vector(int size)
    // 第三种,构造方法创建指定大小的向量,并且增量用 incr 指定。增量表示向量每次增加的元素数目。
    Vector(int size,int incr)
    // 第四种,创建一个包含集合 c 元素的向量
    Vector(Collection c)
    

    与ArrayList不同的是,Vector中的操作是线程安全的,因为Vector中的操作方法,都加了synchronized关键字修饰。但是正因为这个原因,使得Vector操作元素的效率很低。

    SynchronizedList

    SynchronizedList是SynchronizedCollection的子类,实现了List接口。SynchronizedList的get、add等方法,都加了synchronized关键字修饰,但是listIterator()和listIterator(int index)方法没有加。所以在遍历SynchronizedList的时候,需要放到synchronized修饰的代码块里。

    List<String> list = Collections.synchronizedList(new ArrayList<String>());
    list.add("1");
    list.add("2");
    list.add("3");
    
    synchronized (list) {
        Iterator i = list.iterator(); 
        while (i.hasNext()) {
               System.out.println(i.next());
        }
    }
    

    相关文章

      网友评论

        本文标题:Vector和SynchronizedList

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