ArrayList和Vector以及synchronizedList

ArrayList 和 Vector 都是使用数组方式存储数据

Vector 本身所有方法都是用synchronized修饰的,所以线程安全,而ArrayList没有

Vector在新增元素的时候Vector的增量是原来的一倍,而ArrayList增加原来的一半。

synchronizedList修饰的list: private static List<String> testList = Collections.synchronizedList(new ArrayList<String>());

包裹了普通ArrayList, 提供了线程安全的机制,类似于Vector,所以到此为止synchronizedList与Vector

的区别就是ArrayList 与 Vector的增量速度区别,所以需要线程安全操作时,增量比较快的时候推荐使用Vector,其他就没什么了

synchronizedList在迭代的时候,需要开发者自己加上线程锁控制代码,为什么呢?

* It is imperative that the user manually synchronize on the returned
     * list when iterating over it:
     * <pre>
     *  List list = Collections.synchronizedList(new ArrayList());
     *      ...
     *  synchronized(list) {
     *      Iterator i = list.iterator(); // Must be in synchronized block
     *      while (i.hasNext())
     *          foo(i.next());
     *  }

因为迭代器涉及的代码没有在java api中没有加上线程同步代码

public boolean addAll(int index, Collection<? extends E> c) {
        synchronized(mutex) {return list.addAll(index, c);}
        }

    public ListIterator<E> listIterator() {
        return list.listIterator(); // Must be manually synched by user
        }

原因:整个迭代的过程中如果在循环外面不加同步代码,在一次次迭代之间,其他线程对于这个容器的add或者remove会影响整个迭代的预期效果,所以这里需要用户在整个循环外面加上synchronized(list)

参考:http://www.cnblogs.com/yanghuahui/p/3365976.html

原文地址:https://www.cnblogs.com/xiaozhuan/p/5217352.html