ArrayList是非线程安全的,多线程版本是CopyOnWriteArrayList,思路是“快照”。就是读取不会上锁,修改会上锁,但是修改时会拷贝一份出来,在拷贝的数组中修改,修改完了再设置回去。所以读取可能无法读到最新的,如果在读的同时其他修改,这个修改读不到。不会影响。适用于读多的应用。

private E get(Object[] a, int index) {
return (E) a[index];
}


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


其他remove和set类似。