1、Vector是线程安全的,ArrayList不是线程安全的。
2、ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。
只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性。
加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。
和ArrayList和Vector一样,同样的类似关系的类还有HashMap和HashTable,StringBuilder和StringBuffer,后者是前者线程安全版本的实现。
add: synchronized
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
contains: synchronized
public boolean contains(Object o) {
return indexOf(o, 0) >= 0;
}
public synchronized int indexOf(Object o, int index) {
if (o == null) {
for (int i = index ; i < elementCount ; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = index ; i < elementCount ; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
线程不安全的操作:put-if-absent
if (!vector.contains(element))
vector.add(element);
...
}
- 线程A判断完
vector.contains(element)
表明没有element元素,进入if内部; - 此时线程B抢占处理器,执行
vector.contains(element)<br />
- 线程A重新执行,add操作线程不安全了
单个方法具有原子性,但是contains+add的复合操作是没有的.