Vector 和 ArrayList 在新Java版本下,他俩是同门师兄弟,就先说他俩吧。。
比如: 定义一个有20个元素的Vector 集合,再写个3线程的代码,并发来访问和修改Vector的元素。来执行他个几十次,
也不会出现什么问题。要是定义一个有20个元素的ArrayList 集合,再写上3线程的代码,同时来访问和修改ArrayList集合
的元素,执行几次就会出现异常问题。
可是关键是,写出了上面的代码,你也看不到为什么Vector安全。
用毕老师的方法,让你看看ArrayList 和Vector 集合的源代码定义你就明白了。
public class Vector<E>
extends AbstractList<E>
implements List<E>{ //下面是 Vector 集合的源代码,代码太多写不下,只给你看看这些方法定义 ,就不写方法体了
public synchronized void copyInto(Object[] anArray) {}
public synchronized void trimToSize() {}
public synchronized void ensureCapacity(int minCapacity) {}
public synchronized void setSize(int newSize) {}
public synchronized int capacity() {}//上面那几个没用过,下面这几个总用过吧。
public synchronized int size() {}
public synchronized boolean isEmpty() {}
public synchronized int indexOf(Object o, int index) {}
public synchronized int lastIndexOf(Object o) {}
public synchronized E firstElement() {}
...............//可以看到,Vector的几乎所有方法都是 synchronized 修饰的,这可是超级安全的大铁门呀。
}
public class ArrayList<E> extends AbstractList<E>
implements List<E>{ //下面是ArrayList的源代码部分。
public void trimToSize() {}
public void ensureCapacity(int minCapacity) {}
private void grow(int minCapacity) {}
public boolean contains(Object o) {}
public int indexOf(Object o) {}
public int lastIndexOf(Object o) {}
public boolean add(E e) {}
public void add(int index, E element) {}//可以看到ArrayList 这哥们一是一点儿都不安全,没有锁。
public E remove(int index) {} //二是这哥们都是抄袭Vector 的代码,想气死 Vector (玩笑)
public boolean remove(Object o) {} //Vector 已过时了,不考虑安全的不要用他,考虑安全的也不用他,他锁太多,效率低下。。
...................
} |