4 回答

TA贡献1725条经验 获得超7个赞
Vector
同步每个单独的操作。这几乎不是你想要做的。
通常,您希望同步整个操作序列。同步单个操作的安全性较低(Vector
例如,如果你遍历一个,你仍然需要取出一个锁来避免其他人同时更改集合,这会导致ConcurrentModificationException
迭代线程中的一个)但也会更慢(为什么一旦足够就反复取出锁?
当然,即使你不需要,它也有锁定的开销。
基本上,在大多数情况下,这是一种非常有缺陷的同步方法。正如Brian Henk先生指出的那样,您可以使用诸如以下调用来修饰集合Collections.synchronizedList
- Vector
将“调整大小的数组”集合实现与“同步每个操作”位相结合的事实是设计不佳的另一个例子; 装饰方法可以更清晰地分离顾虑。
至于一个Stack
等价物 - 我会看Deque
/ ArrayDeque
开始。

TA贡献1811条经验 获得超4个赞
Vector是1.0的一部分 - 原始实现有两个缺点:
1.命名:向量实际上只是可以作为数组访问的列表,因此它应该被调用ArrayList
(这是Java 1.2 Collections的替代品Vector
)。
2.并发性:所有的get()
,set()
方法是synchronized
,所以你不能有超过同步进行细粒度控制。
ArrayList
和之间没有太大区别Vector
,但你应该使用ArrayList
。
来自API文档。
从Java 2平台v1.2开始,这个类被改进以实现List接口,使其成为Java Collections Framework的成员。与新的集合实现不同,Vector是同步的。

TA贡献1843条经验 获得超7个赞
除了已经陈述的关于使用Vector的答案之外,Vector还有许多关于枚举和元素检索的方法,这些方法与List接口不同,开发人员(特别是那些在1.2之前学习Java的人)可能倾向于使用它们,如果他们在码。尽管枚举速度更快,但它们不会检查集合是否在迭代期间被修改,这可能会导致问题,并且考虑到可能会选择Vector进行同步 - 通过多线程的话务员访问,这使得它成为一个特别有害的问题。这些方法的使用也将大量代码耦合到Vector,因此用不同的List实现替换它并不容易。

TA贡献1875条经验 获得超3个赞
您可以使用synchronizedCollection / List方法java.util.Collection
从非线程安全的集合中获取线程安全集合。
添加回答
举报