Java集合(一) CopyOnWriteArrayList

CopyOnWriteArrayList 類分析
 
1. CopyOnWriteArrayList 其中底層實現存放數據是一個Object數組:
 
private volatile transient Object[] array;
 
2. CopyOnWriteArrayList 集合操做,當對集合中的元素進行修改添加或者替換刪除(增刪改)的時候都是用一個全局的 ReentrantLock lock鎖進行控制線程安全的:
 
transient finall ReentrantLock lock = new ReentrantLock();
 
3. 建立其對象,默認設置一個長度爲0的數組,賦值給array變量。
 
public CopyOnWriteArrayList() {
  setArray(new Object[0]);
}
 
4. 每次添加元素都建立一個新的數組,將原數組的數據複製到新的數組中,將新添加的元素放在新數組的末尾,從新將新數組賦值給 array , 代碼以下:
 
public boolean add(E e) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }
5. 由於存放數據的Object[] array 爲volatile 類型的,因此在取數據的時候,沒有加 lock鎖。
 
6. 在此類中set方法中涉及到 happens-before 原則的代碼以下:
public E set(int index, E element) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            E oldValue = get(elements, index);

            if (oldValue != element) {
                int len = elements.length;
                Object[] newElements = Arrays.copyOf(elements, len);
                newElements[index] = element;
                setArray(newElements);
            } else {
                // Not quite a no-op; ensures volatile write semantics
                setArray(elements);
            }
            return oldValue;
        } finally {
            lock.unlock();
        }
    }
關鍵代碼在else代碼塊,從新到主內存中取了次鏈表中的元素。
 
7. 相關類CopyOnWriteArraySet內部實現是一個CopyOnWriteArrayList,代碼以下:
   private final CopyOnWriteArrayList<E> al;

    /**
     * Creates an empty set.
     */
    public CopyOnWriteArraySet() {
        al = new CopyOnWriteArrayList<E>();
    }

 

完。。。數組

相關文章
相關標籤/搜索