ArrayList和Vector以及synchronizedList


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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM