1. 程式人生 > >Java集合(一) CopyOnWriteArrayList

Java集合(一) CopyOnWriteArrayList

fin unlock new lean lock 元素 pan 控制線 sem

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>();
    }

完。。。

Java集合(一) CopyOnWriteArrayList