7

如果多个线程访问vector,vector会保证同时只有一个线程可以访问vector。SynchronizedList 是一样的。那么有什么区别呢?在一些同步的情况下如何选择?

4

3 回答 3

12

这种冗余的主要原因是向后兼容为旧版本 Java 开发的 Java 代码。

如果我没记错的话,Java 1.2 之前集合是一个单独的库,并且不是标准 JDK/JRE 的一部分。

那时,SDK 提供的唯一类似数据结构的列表是 Vector。在 Collections 中,开发人员以多种方式改进了 Vector 结构。特别是,他们删除了同步,因为在大多数情况下它被证明是不必要的。

他们仍然希望允许一种简单的方法来创建类似集合的列表的同步版本。因此他们引入了 SynchronizedList。

现在 Vector 和 SynchronizedList 之间的主要区别在于您使用它的方式。通过调用 Collections.synchronizedList 您可以围绕当前的 List 实现创建一个包装器,这意味着您不会将数据复制到另一个数据结构并保持底层结构完整。例如,如果你想要它后面的 LinkedList 结构而不是 ArrayList。

如果是 Vector,您实际上会将数据复制到新列表中,例如结构 Vector。因此,如果您之前有一个列表,那么效率会降低,但是如果您之前没有任何数据结构,那么您可能想要使用 Vector,因为它不会为每个方法调用增加方法包装成本。向量的另一个缺点是您不能保留替代的底层结构(例如 LinkedList),您总是使用向量本身中实现的内容。

于 2013-02-18T08:27:55.490 回答
1

默认情况下,Java 向量是同步的。您不必明确同步。即使您这样做,也没有额外的好处

强烈建议不要使用 Java Vector,而是建议使用 Syncronized "ArrayList"。显然有同样的好处。

另请参阅向量是否已过时?

于 2013-02-18T08:26:32.350 回答
0

Vector is a synchronized List implementation and Collections.synchronziedList is a method of Collections utility class that creates a synchronized proxy for any List implementation

于 2013-02-18T08:36:24.597 回答