1、java.util.Vector 所有的操作方法都是 synchronized 修饰, 确保线程安全
2、java.util.Collections.synchronizedList(list) 同样利用 synchronized 代码块, 包装原 list 的操作, 实现线程安全
3、java.util.concurrent.CopyOnWriteArrayList 读写分离的思想, 写上锁, 读无锁. 写入时, 加锁 (利用了 java.util.concurrent.locks.ReentrantLock 上锁), 复制原数组 (并且数组长度 + 1, 赋值数组末尾元素为要新增的元素), 再更新数组的引用, 解锁.