ArrayList和Vector以及synchronizedList

来源:互联网 发布:初中生it就业培训 编辑:程序博客网 时间:2024/06/09 22:47

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

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

还有一个区别就是新增元素的时候Vector的增量是原来的一倍,而ArrayList增加原来的一半

复制代码
public void ensureCapacity(int minCapacity) {    modCount++;    int oldCapacity = elementData.length;    if (minCapacity > oldCapacity) {        Object oldData[] = elementData;        int newCapacity = (oldCapacity * 3)/2 + 1;            if (newCapacity < minCapacity)        newCapacity = minCapacity;            // minCapacity is usually close to size, so this is a win:            elementData = Arrays.copyOf(elementData, newCapacity);    }    }
复制代码

 

synchronizedList修饰的list如下

private static List<String> TEST_LIST = Collections.synchronizedList(new ArrayList<String>());

包裹了普通的ArrayList提供了线程安全的机制,类似Vector,所以到此为止synchronizedList与Vector的区别就是ArrayList与Vector的增量速度区别,所以需要线程安全操作时,增量比较快的时候推荐使用Vector,其他就没什么了

但是注意一点,

复制代码
* 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());     *  }
复制代码

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

首先讲下为什么要手动加线程锁代码:

复制代码
    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        }
复制代码

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

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

0 0
原创粉丝点击