1、
public boolean add(E e) {
ensureCapacityInternal(size+1);// Increments modCount!!
elementData[size++] = e;
return true;
}
ArrayList的元素添加实现方法中,分为两步,调整size,添加元素。
线程A添加一个元素时,元素已经放入,size未增加时,线程B也进行了元素的写入,两个线程放入了一个位置,最后两个线程都完成size+1,而元素添加了同一个位置,导致被覆盖,size添加了2,只添加了其中之一个元素,线程不安全。
2、Vector的添加元素方法,有synchronized将方法锁住,线程安全
public synchronized voidaddElement(Eobj) {
modCount++;
ensureCapacityHelper(elementCount+1);
elementData[elementCount++] = obj;
}