一、簡介
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));
}