
因此,得出结论,ArrayList并不是线程安全的集合!如果需要保证线程安全,建议使用Vector集合,其是线程安全的,但是相对于ArrayList来说,效率比较低。
而Vector相对于ArrayList之所以是线程安全的,就在于其add()为集合添加元素的方法:
// 可以看出Vector的add方法加上了synchronized 同步关键字
public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}
为解决此问题呢,java引入了一个可以保证读和写都是线程安全的集合(读写分离集合):CopyOnWriteArrayList
所以解决方案就是:
// private static ArrayList1.6—ArrayList和LinkedList 的区别?list = new ArrayList<>(); // 使用读写分离集合替换掉原来的ArrayList private static CopyOnWriteArrayList list = new CopyOnWriteArrayList (); static { list.add("Jack"); list.add("Amy"); list.add("Lucy"); }
ArrayList
LinkedList