为什么 Java Vector 被视为遗留类、已过时或已弃用?
处理并发时它的使用是否有效?
如果我不想手动同步对象并且只想使用线程安全集合而不需要制作底层数组的新副本(就像CopyOnWriteArrayList那样),那么可以使用Vector吗?
CopyOnWriteArrayList
Vector
怎么样Stack,它是 的子类Vector,我应该用什么来代替它?
Stack
Vector同步每个单独的操作。这几乎不是你想做的。
通常,您希望同步 整个操作序列 。同步单个操作既不安全(例如,如果您迭代 a Vector,您仍然需要取出锁以避免其他任何人同时更改集合,这会导致 aConcurrentModificationException在迭代线程中)而且速度较慢(一次就够了,为什么要反复拔锁)?
ConcurrentModificationException
当然,即使您不需要,它也有锁定的开销。
基本上,在大多数情况下,这是一种非常有缺陷的同步方法。正如 Brian Henk 先生 指出的那样,您可以使用以下调用来装饰集合Collections.synchronizedList- 将“调整大小的数组”集合实现与“同步每个操作”位相结合的事实Vector是设计不佳的另一个例子;装饰方法提供了更清晰的关注点分离。
Collections.synchronizedList
至于Stack等价物 - 我会从Deque/ArrayDeque开始。
Deque
ArrayDeque