jdk1.8集合框架源碼解析(五)CopyOnWriteArrayList源碼解析

一、簡介

CopyOnWriteArrayList 是ArrayList的線程線程安全版本,其主要是通過volitle 修飾數組本事保證寫操作對其他線程可見性,寫操作是使用ReentrantLock加鎖,每次對數組的寫操作,都完全拷貝一份新的數組來修改,修改完了再替換掉老數組,這樣保證了只阻塞寫操作,不阻塞讀操作,實現讀寫分離。

二、繼承體系

public class CopyOnWriteArrayList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}

CopyOnWriteArrayList實現了List接口、RandomAccess(可隨機訪問)、Cloneable(可拷貝)、Serializable(可序列化)。

 

 三、重要字段

    /** The lock protecting all mutators */
    //用於寫操作加鎖,使用transient修飾表示不自動序列化。
    final transient ReentrantLock lock = new ReentrantLock();

    /** The array, accessed only via getArray/setArray. */
    //存儲元素的地方,使用volatile修飾表示保證了寫操作對其他線程的可見性,
    private transient volatile Object[] array;

四、構造函數

4.1、CopyOnWriteArrayList()

這裏有對數組的set,get方法,所有對數組的操作都基於get,set方法

final Object[] getArray() {
    return array;
}

final void setArray(Object[] a) {
    array = a;
}

 創建空數組,把他賦值給CopyOnWriteArrayList

  public CopyOnWriteArrayList() {
        setArray(new Object[0]);
   }

4.2、CopyOnWriteArrayList(Collection<? extends E> c)

 

 public CopyOnWriteArrayList(Collection<? extends E> c) {
        Object[] elements;
        //如果c也是CopyOnWriteArrayList直接拿到他的數組進行賦值
        if (c.getClass() == CopyOnWriteArrayList.class)
            elements = ((CopyOnWriteArrayList<?>)c).getArray();
        else {
            elements = c.toArray();
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elements.getClass() != Object[].class)
                elements = Arrays.copyOf(elements, elements.length, Object[].class);
        }
        setArray(elements);
    }

 c.toArray()返回的不一定是Object[]類型,具體可以查看jdk bug單 (單號6260652),這個bug jdk9已經解決.

地址爲 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6260652

 4.3、 CopyOnWriteArrayList(E[] toCopyIn)

    public CopyOnWriteArrayList(E[] toCopyIn) {
        setArray(Arrays.copyOf(toCopyIn, toCopyIn.length, Object[].class));
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章