Java集合(一) CopyOnWriteArrayList
阿新 • • 發佈:2017-07-02
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 , 代碼如下:
public5. 因為存放數據的Object[] array 為volatile 類型的,所以在取數據的時候,沒有加 lock鎖。 6. 在此類中set方法中涉及到 happens-before 原則的代碼如下: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(); } }
public E set(int index, E element) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements關鍵代碼在else代碼塊,重新到主內存中取了次鏈表中的元素。 7. 相關類CopyOnWriteArraySet內部實現是一個CopyOnWriteArrayList,代碼如下:= 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(); } }
private final CopyOnWriteArrayList<E> al; /** * Creates an empty set. */ public CopyOnWriteArraySet() { al = new CopyOnWriteArrayList<E>(); }
完。。。
Java集合(一) CopyOnWriteArrayList