Vector 源码解析

关于 synchronized

在 Java 中 synchronized 可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。

而 synchronized 底层是通过使用对象的监视器锁(monitor)来确保同一时刻只有一个线程执行被修饰的方法或者代码块。可以用锁和钥匙来解释,被 synchronized 修饰的方法或者代码块是一把锁,这把锁是归对象所有的,当一个线程需要执行这些方法或者代码块的时候,锁就被钥匙插上了,所以其他线程就不能执行这些方法或者代码块。(实际情况还要更加复杂,这里只是便于理解,实际上 synchronized 的锁是可重入的)

Vector 同步

它的实现与 ArrayList 类似,但是使用了 synchronized 进行同步。

1
2
3
4
5
6
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
1
2
3
4
5
6
public synchronized E get(int index) {
if (index>= elementCount)
throw new ArrayIndexOutOfBoundsException(index);

return elementData(index);
}

与 ArrayList 的比较

  • Vector 是同步的,因此开销就比 ArrayList 要大,访问速度更慢。最好使用 ArrayList 而不是 Vector,因为同步操作完全可以由程序员自己来控制;
  • Vector 每次扩容请求其大小的 2 倍空间,而 ArrayList 是 1.5 倍。

感谢

本文所有内容均节选自下面两篇文章,感谢分享。

Java 容器

Java 中的 synchronized

0%